【问题标题】:Prevent Enter Event from Bubbling to to Main Window防止进入事件冒泡到主窗口
【发布时间】:2011-04-28 21:16:18
【问题描述】:

我有一个名为 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 事件,立即再次打开对话框!

如何在 ENTER 事件被处理后取消对话框的“确定”按钮?

【问题讨论】:

    标签: java events swing awt keyboard-events


    【解决方案1】:

    不要使用 KeyListeners。

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

    【讨论】:

    • 谢谢!我不知道为什么 KeyListeners 有这个问题而 Key Bindings 没有,但是使用 Key Bindings 就可以了......
    【解决方案2】:

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

    【讨论】:

    • 不幸的是,getSource() 总是返回 NavigationLink.this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多