Java 摆动事件过滤器

Java 摆动事件过滤器,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

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

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

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))处理的每个事件,我希望在
侦听器中接收,然后您可以将所有侦听器放入数组中,

在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 );   
LayerUI ui=new LayerUI(){
@凌驾

受保护的void processMouseEvent(MouseEvent e,JLayer如果要在事件被分派到组件之前拦截事件,请签出

如果您只想收听所有事件,请退出

在这两种情况下,您都需要检查事件源,以确定它是否用于面板上的组件

但是,我相信,这不会捕获ActionEvent,因为这不是系统事件,而是特定组件上鼠标按下/鼠标释放的Java生成事件


如果我们知道过滤的原因,那么也许我们可以提供另一种方法。例如,也许您正在尝试创建一个?

请在此处发布,那么我可能会是我的答案更有用的/what is EventDispatchingMachine?@kleopatra,这是一个虚拟类,用于附加接收发送给其他承包商的事件的事件侦听器将
mainPanel
作为其父级的ols(直接或通过其他容器,例如
txt1
control)@misha nesterenko在任何不可能的事情发生之前,先改变Swing中启动侦听器的顺序,然后在GroupListener中确定源和类???,我要问的是,您是想收集这些事件进行日志记录和跟踪,还是可以管理具体用户或对象的访问,因为我看到了最重要的区别ies,我不想存储,我只需要在控件转到其控件之前,以某种方式接收所有针对已指定父控件的事件。