Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Swing: как передавать событие между несвязанными компонентами? / 6 сообщений из 6, страница 1 из 1
28.08.2014, 14:21
    #38731638
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Swing: как передавать событие между несвязанными компонентами?
Вот накидал маленький пример приложения с кастомным событием.
Создается 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
28.08.2014, 14:23
    #38731640
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Swing: как передавать событие между несвязанными компонентами?
mesier,

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

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

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

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


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