Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在帧内捕捉按键_Java_Swing_User Interface_Key Bindings_Keylistener - Fatal编程技术网

Java 在帧内捕捉按键

Java 在帧内捕捉按键,java,swing,user-interface,key-bindings,keylistener,Java,Swing,User Interface,Key Bindings,Keylistener,这似乎是一个简单的行为,但我很难做到这一点。我正在开发一个可以绘制数据的软件。我想在用户点击enter键时重新绘制图形。更准确地说,我想在用户点击enter并且没有选择文本字段时绘制图形;但现在,只要用户点击回车键,我就会对绘图感到满意 我试着先在框架上安装一个基本的keylister,但这不起作用,因为接收事件的是JFrame子对象,而不是框架 然后我尝试使用KeyEventDispatcher,但事实证明这是一个过于全局的概念。我可以同时在屏幕上显示两个图形,一个旧图形可以关闭或替换为一个新

这似乎是一个简单的行为,但我很难做到这一点。我正在开发一个可以绘制数据的软件。我想在用户点击enter键时重新绘制图形。更准确地说,我想在用户点击enter并且没有选择文本字段时绘制图形;但现在,只要用户点击回车键,我就会对绘图感到满意

我试着先在框架上安装一个基本的
keylister
,但这不起作用,因为接收事件的是
JFrame
子对象,而不是框架

然后我尝试使用
KeyEventDispatcher
,但事实证明这是一个过于全局的概念。我可以同时在屏幕上显示两个图形,一个旧图形可以关闭或替换为一个新图形。使用
KeyEventDispatcher
我无法简单地知道我想在一次打开的多个绘图中激活哪个绘图,而当前打开的绘图可能不是我实例化key dispatcher时打开的绘图。我知道这个解决方案仍然可以工作,但它需要我存储额外的数据,以确定哪些绘图当前处于活动状态,而这些绘图不适合程序体系结构


似乎应该有一种更简单的方法来捕获分派给
JFrame/JPanel
JFrame的任何子对象的
KeyEvents
;但忽略发送到其他帧的事件。优选地,提供一种方法,该方法可以被添加到帧中,从而在帧被布置时被自动布置。有谁能推荐一种比我尝试过的更简单的方法吗?

不要使用键盘监听器


将a添加到图形面板。

这非常有效

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();
            }
        }
    });

非常感谢。我知道必须有一个更简单的方法,但我似乎不能靠自己偶然发现它。