Java AWTEventListener缺少事件

Java AWTEventListener缺少事件,java,swing,awt,mouse,listener,Java,Swing,Awt,Mouse,Listener,我有一个问题,我的侦听器无法获取所有AWT事件。 至少我希望如此。 我的另一个问题是,我无法在一段代码上重建问题:( 我所做的是: 听所有awtevent(实际上只有鼠标事件) 按下鼠标启动计时器 当计时器完成且LMB仍被按下时,鼠标指针处的组件将从层次结构中移除 在这一点上,只要我仍然按下LMB,我只会得到鼠标退出和鼠标进入的事件。没有移动、拖动甚至鼠标释放的事件 我一松开鼠标按钮,一切就恢复正常 有什么建议会导致问题吗 @编辑:代码示例已更新 package awtbug;

我有一个问题,我的侦听器无法获取所有AWT事件。 至少我希望如此。 我的另一个问题是,我无法在一段代码上重建问题:(

我所做的是:

听所有awtevent(实际上只有鼠标事件)

按下鼠标启动计时器

当计时器完成且LMB仍被按下时,鼠标指针处的组件将从层次结构中移除

在这一点上,只要我仍然按下LMB,我只会得到鼠标退出和鼠标进入的事件。没有移动、拖动甚至鼠标释放的事件

我一松开鼠标按钮,一切就恢复正常

有什么建议会导致问题吗

@编辑:代码示例已更新

    package awtbug;

    import java.awt.AWTEvent;
    import java.awt.Toolkit;
    import java.awt.event.AWTEventListener;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;

    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;

    @SuppressWarnings("serial")
    public class MyAWTBug extends JFrame{

        public static void main(String[] args) {
            new MyAWTBug();
        }

        public MyAWTBug() {
            setSize(300, 300);
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            this.getContentPane().add(new AWTListenerPanel());
        }

        private class AWTListenerPanel extends JPanel implements AWTEventListener {

            JPanel somePanel = new JPanel();

            public AWTListenerPanel() {
                Toolkit.getDefaultToolkit().addAWTEventListener(this, Long.MAX_VALUE);
                this.add(somePanel);
            }

            @Override
            public void eventDispatched(AWTEvent event) {

                System.out.println("-----------------------");
                System.out.println(event);

                if (event instanceof MouseEvent) {
                    if (event.getID() == MouseEvent.MOUSE_PRESSED) {

                        Timer timer = new Timer(100, new ActionListener() {

                            @Override
                            public void actionPerformed(ActionEvent e) {
                                modifyTree();
                            }
                        });

                        timer.setRepeats(false);
                        timer.restart();
                    }
                }
            }

            private void modifyTree() {
                getContentPane().remove(somePanel);
                getContentPane().add(somePanel);
                System.err.println("stuff done");
            }
        }
    }
@编辑2: 我可以把范围缩小到

外部组件移除(内部组件)


一旦我这样做,事件就停止了…

不是答案,测试代码应该是

  • (主要问题)JPanel被添加到已经可见的JFrame中,LayoutManager没有任何通知程序(参见第2点)

  • 使用validate()和repaint();作为LayoutManager的最后一行代码、通知程序和信号

  • 始终为测试目的重新创建局部变量

  • 永远不要为了测试目的而扩展任何东西,我迷失在这一点上了。没有这个,什么方法

  • (次要但事件顺序已更改)使用初始线程

  • 我被忽略了JFrames边界从未改变(太懒)

  • Swing Timer也应定义为局部变量

    编辑

  • 只有组件树中最上面的JComponent可以触发(并使用所有)键和鼠标事件,JPanel在这种情况下,JPanel应该/必须为KeyEvents设置为setFocusable(),并且JPanel添加到modifyTree()中,缺少JFrame。(重新)验证()和重新绘制(),则此JPanel未在组件层次结构中正确注册,您可以通过向ContentPane添加层次结构或ComponentListener来进行测试


  • 将AWTEventListener添加到JPanel、ContentPane、RootPane,而不是添加到JFrame(默认情况下,从不对KeyEvents作出反应)刚刚调整了我的代码示例。但问题仍然是,在这个示例中,所有内容都正常工作,但在我的项目中没有。因此,我正在寻找解决问题的方法。意外地,我发现将删除的组件添加到另一个容器中解决了问题。因此,这个问题仍然存在,但对我来说不再是问题。Eno对于一个空间中的许多组件,使用一个在这个空间中看到的。简洁的建议:)但是实际上我所做的是接管对鼠标事件的控制来进行手势识别等等。但这两种方法仍然可以完美地工作,因此我仍然没有一个示例代码来演示实际问题:/每个按键和鼠标(或三个组合)事件都可以从LayoutManager正确接受的JComponent中触发一个事件(在modifyTree()中引发),以使用我的代码测试您的问题,因为(未进行测试或最深的测试)看起来像(不包括按键修饰符和鼠标事件中的一些错误)正确触发事件
    import java.awt.AWTEvent;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.awt.event.AWTEventListener;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    import javax.swing.border.LineBorder;
    
    public class MyAWTBug implements AWTEventListener {
    
        private JPanel panel = new JPanel();
        private JFrame frame = new JFrame();
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new MyAWTBug();
                }
            });
        }
    
        public MyAWTBug() {
            Toolkit.getDefaultToolkit().addAWTEventListener(this, Long.MAX_VALUE);
            panel = new JPanel();
            panel.setBackground(Color.red);
            panel.setBorder(new LineBorder(Color.black, 1));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(panel);
            frame.setPreferredSize(new Dimension(300, 300));
            frame.pack();
            frame.setVisible(true);
        }
    
        @Override
        public void eventDispatched(AWTEvent event) {
            System.out.println("-----------------------");
            for (AWTEventListener listener : Toolkit.getDefaultToolkit().getAWTEventListeners()) {
                System.out.println(listener);
            }
            System.out.println("-----------------------");
            System.out.println(event);
            if (event instanceof MouseEvent) {
                if (event.getID() == MouseEvent.MOUSE_PRESSED) {
                    Timer timer = new Timer(500, new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            modifyTree();
                        }
                    });
                    timer.setRepeats(false);
                    timer.restart();
                }
            }
        }
    
        private void modifyTree() {
            frame.remove(panel);
            panel = new JPanel();
            panel.setBorder(new LineBorder(Color.black, 1));
            frame.add(panel);
            frame.validate();
            frame.repaint();
            frame.setPreferredSize(new Dimension((int) Math.random() * 50 + 300, (int) Math.random() * 50 + 300));
            frame.pack();
            System.err.println("stuff done");
        }
    }