фильтр событий свинга - PullRequest
1 голос
/ 12 января 2012

Можно ли установить фильтр для событий для всех элементов управления, размещенных в каком-либо контейнере?

Например, у меня есть панель с двумя кнопками и одна панель с двумя текстовыми полями. Я хочу получать все события, которые поступают на эти элементы управления (кнопки и текстовые поля).

UPD Есть четыре элемента управления:

JPanel mainPanel = new JPanel(new BorderLayout());
JButton b1 = new JButton();
JButton b2 = new JButton();
mainPanel.add(b1, BorderLayout.WEST);
mainPanel.add(b2, BorderLayout.EAST);

JPanel childPanel = new JPanel(new FlowLayout());
JTextField txt1 = new JTextField();
JTextField txt2 = new JTextField();
childPanel.add(txt1);
childPanel.add(txt2);
mainPanel.add(childPanel, BorderLayout.SOUTH);

EventDispatchingMachine.attachEventListener(mainPanel, listener);

где listener получает все события, которые идут на b1, b2, txt1, txt2. В идеале каждое событие, которое может быть обработано через прослушиватель на конкретном элементе управления (например, b1.addActionListener (asd)), которое я хочу получить в listener.

Ответы [ 3 ]

3 голосов
/ 12 января 2012

В jdk7 вы можете использовать JLayer для украшения любого компонента слушателями:

    LayerUI<JComponent> ui = new LayerUI<JComponent>() {

        @Override
        protected void processMouseEvent(MouseEvent e, JLayer<? extends JComponent> l) {
             System.out.println(e.getSource().getClass() + " at " + e.getPoint());
        } 
    };
    JLayer<JComponent> layer = new JLayer<JComponent>(mainPanel, ui);
    layer.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK );   

(для jdk6 есть проект JXLayer, который поддерживает то же самое)

Edit

при втором чтении вопроса ответ может быть «невозможен»: событие! = Событие.Вы можете (через LayerUI или вручную AWTEventListener) зарегистрироваться, чтобы получать все события, которые отправляются глобально.Вы не можете подключиться к «локально» отправленным событиям, как fi actionEvents, которые просто используются в качестве параметров для известного метода обратного вызова, который вызывается непосредственно отправителем.

2 голосов
/ 12 января 2012

Если вы хотите перехватить события до того, как они отправлены в компонент, проверьте Глобальная диспетчеризация событий .

Если вы просто хотите прослушать все события, посмотрите Global Event Listeners .

В обоих случаях вам нужно будет проверить источник события, чтобы определить, относится ли он к компоненту на панели.

Однако, я полагаю, это не перехватит ActionEvent, потому что это не системное событие, а событие, сгенерированное Java для mousePressed / mouseReleased для определенного компонента.

Если бы мы знали причину фильтрации, то, возможно, мы могли бы предложить альтернативный подход. Например, может быть, вы пытаетесь создать Отключенную панель ?

2 голосов
/ 12 января 2012

вы посмотрите на EventListenerList , затем вы можете перевести всех слушателей в массив,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...