在帧内捕获按键

时间:2011-06-29 19:44:31

标签: java swing user-interface key-bindings keylistener

这似乎是一种简单的行为,但我很难实现它。我正在研究绘制数据图表的软件。我想在用户点击进入时重绘图表。更确切地说,当用户点击进入并且没有选择文本字段时,我想绘制图形;但是现在,只要用户点击进入,我就会对绘图感到满意。

我首先尝试在框架中安装基本KeyListener,但这不起作用,因为JFrame子项而不是框架会收到该事件。

然后我尝试使用KeyEventDispatcher,但它证明了全球性的概念。我可以同时在屏幕上显示两个图表,可以关闭旧图表或用新图表替换旧图表。使用KeyEventDispatcher我没有简单的方法可以知道我想要激活多个绘图中的哪个绘图,而现在打开的绘图可能不是我实例化密钥调度程序时打开的绘图。我知道这个解决方案仍然可以工作,但它需要我存储额外的数据,以确定当前活动的情节不适合程序架构。

似乎应该有一种更简单的方法来捕获派遣到KeyEventsJFrame/JPanel个孩子的任何JFrame's;但忽略调度到其他帧的事件。优选的是可以添加到框架中并因此在框架被布置时自动设置的方法。任何人都可以建议一种更简单的方法然后我尝试过吗?

2 个答案:

答案 0 :(得分:2)

不要使用KeyListener。

在图表面板中添加Key Binding

答案 1 :(得分:0)

This works very well

this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "fecharAction");
    this.getRootPane().getActionMap().put("fecharAction", new AbstractAction() {
        private static final long serialVersionUID = 1L;
        @Override
        public void actionPerformed(ActionEvent e) {
            int resp = JOptionPane.showConfirmDialog(MainForm.this, "Encerrar sistema?", "Confirmação", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            if (resp == 0) {
                MainForm.this.setVisible(false);
                MainForm.this.dispose();
            }
        }
    });