【问题标题】:How to capture keyEvent on parent when any child is focused? [duplicate]当任何孩子集中注意力时,如何在父母身上捕获keyEvent? [复制]
【发布时间】:2013-11-12 16:55:16
【问题描述】:

我的 JDialog 包含许多 JTextFields 和 JLabels 以及 jbutton。当这些组件(文本字段或按钮)中的任何一个被聚焦并键入 ESCAPE 时,我想在父 JDialog 中捕获生成的 keyEvent。

我知道对此有明确的解决方案。 我在网上找不到。

谢谢!

【问题讨论】:

  • 请写一些代码,以便我们快速帮助您

标签: java swing keyevent event-bubbling


【解决方案1】:

阅读有关key bindings 的更多信息。 尝试下一个可以帮助您的代码:

public static void main(String[] args) {

    JFrame f = new JFrame();
    JTextField field =new JTextField();
    f.getContentPane().add(field,BorderLayout.SOUTH);

    ((JPanel)f.getContentPane()).getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"), "doSomething");
    ((JPanel)f.getContentPane()).getActionMap ().put("doSomething", new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("test");
        }
    });
    f.getContentPane().add(new JLabel("1"),BorderLayout.NORTH);


    f.pack();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
}

使用下一个构造getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT),因为:组件包含(或是)具有焦点的组件。此输入映射通常用于复合组件——其实现依赖于子组件的组件。(根据文档)

【讨论】:

  • 是的,这是正确的。但是如何为 Escape 创建 KeyStroke。因为我只看到 F2。
  • 用ESCAPE改F2,就可以了!
  • ((JPanel)super.getContentPane()).getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("released ESCAPE"), "actionOnEscape");
  • 你可以写KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0)
  • 这里的0是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2020-11-10
相关资源
最近更新 更多