powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Swing: как передавать событие между несвязанными компонентами?
6 сообщений из 6, страница 1 из 1
Swing: как передавать событие между несвязанными компонентами?
    #38731638
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот накидал маленький пример приложения с кастомным событием.
Создается JPanel, на которое помещается наследник JComponent, "кирпичик" зеленого цвета, умеющий обрабатывать собития и "двигаться" на экране в пределах своего контейнера.

Класс события:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
package customeventsapp;

import java.util.EventObject;

public class MoveBarEvent extends EventObject {
    
    private int x;
    private int y;

    public MoveBarEvent(Object source) {
        super(source);
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}



Слушатель (тут на самом деле ничего интересного)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
package customeventsapp;

import java.util.EventListener;

public interface MoveBarListener extends EventListener {
    
    void barMoved(MoveBarEvent e);

}



"Таскаемый" компонент.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
public class Bar extends JComponent  {
    
    private volatile int atX, atY;    
    
    public Bar() {
        this.addMouseMotionListener(new DragMouse());
        this.addMouseListener(new PressMouse());
    }

    public int getAtX() {
        return atX;
    }

    public int getAtY() {
        return atY;
    }
        
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(50, 20);
    }
    
    public void paintComponent(Graphics g) {
        g.setColor(Color.green);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.black);
        g.draw3DRect(0, 0, getWidth(), getHeight(), true);
    }
    
    public void addMoveBarListener(MoveBarListener l) {
        listenerList.add(MoveBarListener.class, l);
    }
    
    public void removeMoveBarListener(MoveBarListener l) {
        listenerList.remove(MoveBarListener.class, l);
    }
        
    protected void fireMoveBar(int x, int y) {
        Object[] listeners = listenerList.getListenerList();
        for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == MoveBarListener.class) {
                MoveBarEvent event = new MoveBarEvent(this);
                event.setX(x);
                event.setY(y);
                ((MoveBarListener)listeners[i + 1]).barMoved(event);
            }
        }
    }
        
    class DragMouse extends MouseAdapter {
        public void mouseDragged(MouseEvent e) {
            fireMoveBar(e.getX(), e.getY());
        }
    }
    
    class PressMouse extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            atX = e.getX();
            atY = e.getY();
        }
    }
}



Главный класс приложения
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public class MovingObjects extends JFrame {
    
    private final Bar bar;

    public MovingObjects() {
        
        super("MovingObjects");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        bar = new Bar();
        bar.addMoveBarListener(new MoveBarListener() {
            public void barMoved(MoveBarEvent e) {
                bar.setLocation(e.getX() - bar.getAtX() + bar.getLocation().x,
                        e.getY() - bar.getAtY() + bar.getLocation().y);                
            }
        });
        JPanel panel = new JPanel();
        setContentPane(panel);
        panel.add(bar);
        
        setSize(800, 600);
        setVisible(true);    
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() { 
                new MovingObjects(); 
            } 
        });    
    }
}



Однако здесь событие обрабатывается в том же компоненте, где и возникает.
Действительно, ведь поле listenerList, куда добавляются слушатели, принадлежит компоненту.
А как быть, если нужно передать событие в несвязанный объект?
Допустим, добавляем на панель некий статусбар, в котором будем показывать текущие координаты нашего двигаемого зеленого кирпичика.
Как его сделать подписчиком событий MoveBarEvent?
...
Рейтинг: 0 / 0
Swing: как передавать событие между несвязанными компонентами?
    #38731640
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier,

Выкинь Swing и возьми JavaFX. Там через биндинг свойств это элементарно делать.
А в Swing тебе нужно следовать JavaBeans - реализовать PropertyChangeListener и PropertyChangeSupport, подписать слушателя и кидать PropertyChangeEvent.
...
Рейтинг: 0 / 0
Swing: как передавать событие между несвязанными компонентами?
    #38732387
oneHalf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JavaBeans не обязательно, достаточно использовать Observable/Observer, просто в JavaFX все эти внутренности спрятаны в биндинг.
http://www.javaquizplayer.com/blogposts/blogpost7.html
...
Рейтинг: 0 / 0
Swing: как передавать событие между несвязанными компонентами?
    #38732537
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Выкинь Swing и возьми JavaFX.

Что еще прикажешь выкинуть?
...
Рейтинг: 0 / 0
Swing: как передавать событие между несвязанными компонентами?
    #38732615
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexJmBlazkowicz Выкинь Swing и возьми JavaFX.

Что еще прикажешь выкинуть?
Мне тоже непонятно что такое "биндинг свойств". Это опция языка, платформы или
"ватрушка" в среде разработки? Вобщем нужно прояснение чем это ЖаваФХ
так немерянно крут.
...
Рейтинг: 0 / 0
Swing: как передавать событие между несвязанными компонентами?
    #38732683
oneHalf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JavaFX - это Swing 2.0, может так будет понятней )), этим он и крут ).
Про биндинг можно прочитать любую статью и сразу станет понятно для чего, что и как. Просто пересказывать это чета не хочется.

Сейчас пишу небольшой проект на JavaFX - таблички, формочки, менюшки - полет нормальный.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Swing: как передавать событие между несвязанными компонентами?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]