是否可以为放置在某个容器中的所有控件安装事件过滤器?
例如,我有一个面板,其中有两个按钮,一个面板有两个文本框,我希望能够接收到这些控件(按钮和文本框)的所有事件。
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 的所有事件。理想情况下,我想在 listener
中接收可以通过特定控件上的监听器处理的每个事件(例如 b1.addActionListener(asd))。
最佳答案
在 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支持)
编辑
二读问题时,答案可能是“不可能”:event != event.您可以(通过 LayerUI 或手动 AWTEventListener)注册以接收全局调度的所有事件。你不能像 f.i. 那样 Hook 到“本地”调度的事件中。 actionEvents 仅用作发送者直接调用的已知回调方法的参数。
关于java - Swing 事件过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8834523/