阻止输入事件从冒泡到主窗口

时间:2010-10-21 22:00:48

标签: java events swing awt keyboard-events

我有一个名为NavigationLink的自定义Swing组件,它扩展了JLabel并实现了一个关键事件监听器,如下所示:

addKeyListener(new KeyAdapter() {
    public void keyReleased(KeyEvent e) {
        boolean actionInvoked = e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE;
        if (actionInvoked && NavigationLink.this.clickAction != null) {
            NavigationLink.this.clickAction.run();
        }
    }
});

clickAction是一个Runnable,它打开一个JOptionPane.showMessageDialog,其中包含一个按钮,“OK”。所有这一切都很好,问题如下:

  1. 用户使用TAB导航到NavigationLink,直到成为焦点
  2. 使用按ENTER,打开对话框信息,默认情况下使用“确定”按钮进行对焦
  3. 用户按ENTER键关闭对话框,但也导致我们的NavigationLink中的keyReleased事件触发,立即再次打开对话框!
  4. 如何在处理后取消ENTER事件,但是对话框为“OK”按钮?

2 个答案:

答案 0 :(得分:1)

不要使用KeyListeners。

您应该使用Key Bindings将Enter键绑定到Action。

答案 1 :(得分:0)

您可以通过调用getSource()来尝试在keyReleased方法中检查KeyEvent的源代码。如果源不是NavigationLink组件,则不要调用NavigationLink.this.clickAction.run()。