如何在任何孩子聚焦时捕获父母的keyEvent?

时间:2013-11-01 13:23:55

标签: java swing keyevent event-bubbling

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

我知道有明确的解决方案。 我无法在网上找到它。

谢谢!

1 个答案:

答案 0 :(得分:2)

详细了解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),因为:该组件包含(或是)具有焦点的组件。此输入映射通常用于复合组件 - 一个实现依赖于子组件的组件。(根据文档)