java - Swing 事件过滤器

标签 java swing

是否可以为放置在某个容器中的所有控件安装事件过滤器?

例如,我有一个面板,其中有两个按钮,一个面板有两个文本框,我希望能够接收到这些控件(按钮和文本框)的所有事件。

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/

相关文章:

java - SWIG 在 Java 中包装 boost::optional<>

java - 将 eclipse (不是工作区)移动到不同的目录

java - Google App Engine 端点中的自定义 JSON 实体解析

Java 泛型查询

java - EDT队列切割

swing - 如何从 nasa worldwind 中删除世界地图

java - 如何在应用程序退出之前使文本字段失去焦点?

java - 可以用 Go 编写 Intellij 插件吗?

java - 如何用新的散点更新绘图区域?

java - 在 Runnable 对象中启动和处理 JFrame,howto