listener在调度keyevent(或任何类型的事件?)时不会收到通知

eqfvzcg8  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(256)

这不是特定领域关键事件的问题。我使用keyevents/keylisteners和jbutton作为示例。我所希望的就是能够在junit测试中方便地激发监听器。
我试图在单元测试中触发一个关键侦听器,但由于某些原因,该侦听器没有被触发。

public class Example {
    public static void main(String[] args) {
        AtomicBoolean keyReleasedRan = new AtomicBoolean(false);
        JButton button = new JButton();
        button.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                keyReleasedRan.set(true);
            }
        });

        int modifiers = 100; //Something, we don't care
        int keyCode = KeyEvent.VK_A; //something realistic
        KeyEvent event = new KeyEvent(button, KeyEvent.KEY_RELEASED, System.currentTimeMillis() + 200,
                modifiers, keyCode, 'a');

        button.dispatchEvent(event);

        System.out.println("KEY RELEASED RAN: " + keyReleasedRan.get());
    }
}

我在事件构造函数中尝试了多个参数,以防它发挥作用,但侦听器始终不会被触发。
唯一可行但我真的不想遵循的方法是迭代 KeyListener (s) 打电话 keyReleased() 方法,用于每个侦听器。
知道我做错了什么吗?
我尝试了另一个组件而不是jbutton,但结果相同。

wsewodh2

wsewodh21#

正如评论所说,如果您将它附加到jframe,它就会工作。
在单元测试中使用它时,还需要自动关闭jframe。所以我加了一句 frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING)); .

public class Test {
    public static void main(String[] args) {
        JButton button = new JButton("Run");
        button.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("runs...");
            }
        });

        JFrame frame = new JFrame();
        frame.add(button);
        frame.setSize(50, 50);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        int modifiers = InputEvent.SHIFT_DOWN_MASK; //Something, we don't care
        int keyCode = KeyEvent.VK_A; //something realistic
        KeyEvent event = new KeyEvent(button, KeyEvent.KEY_RELEASED, System.currentTimeMillis() + 200,
            modifiers, keyCode, 'a');

        button.dispatchEvent(event);
        frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
    }
}

相关问题