Java JButton doClick()执行上次单击的按钮

Java JButton doClick()执行上次单击的按钮,java,swing,jframe,jbutton,keylistener,Java,Swing,Jframe,Jbutton,Keylistener,这是我用来检查按键的代码块。如果我按下“esc”键,JFrame将关闭。但是,如果我按下“空格”键,侦听器将执行最后一次按下的JButton,而不是我要它单击的特定按钮。除非之前单击了JButton,否则doClick()也不会运行 addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent ke) { if(ke.getKeyCode() == KeyEvent.VK_ESCAPE) {

这是我用来检查按键的代码块。如果我按下“esc”键,JFrame将关闭。但是,如果我按下“空格”键,侦听器将执行最后一次按下的JButton,而不是我要它单击的特定按钮。除非之前单击了JButton,否则doClick()也不会运行

addKeyListener(new KeyAdapter() {
    public void keyPressed(KeyEvent ke) { 
        if(ke.getKeyCode() == KeyEvent.VK_ESCAPE) {
            SaveScripts.saveData(player);
            dispose();
        }
        if(ke.getKeyCode() == KeyEvent.VK_SPACE) {
            center.buttonMenuAttack.doClick(); 
        }
    } 
});
编辑1:好的,经过一些测试之后,问题似乎是当点击帧中的任何内容时侦听器会中断

  • 项目启动
  • 倾听者是积极的和工作的
  • 单击框架的任何组件时,侦听器都会中断
  • 编辑2:我最终选择了camickr的解决方案,它更容易设置,而且我在使用它时没有遇到任何问题

    InputMap events = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap actions = getRootPane().getActionMap();
    
    events.put(KeyStroke.getKeyStroke("SPACE"), "click");
    actions.put("click", new AbstractAction() { 
        public void actionPerformed(ActionEvent event) { 
            center.bAttack.doClick();
            } 
        });
    events.put(KeyStroke.getKeyStroke("ESCAPE"), "click");
    actions.put("click", new AbstractAction() { 
        public void actionPerformed(ActionEvent event) { 
            manage.bDataExit.doClick();
            } 
        });
    

    我解决了这个问题。侦听器停止工作,因为当单击按钮时,它会成为焦点。我创建了一个扩展JButton的类,这样我的所有按钮都具有相同的行为,并向其构造函数添加了以下代码行

    setRequestFocusEnabled(false);
    

    这样,单击按钮后,JFrame将保持焦点,允许侦听器按预期的方式运行。

    您可以尝试在空格键的
    if
    语句中插入
    ke.consume()
    行。也许这对你有帮助。如果不是这样,请提供一个示例,以便我们也可以重现(并更好地理解)您的问题。不要使用KeyListener。KeyEvent仅在组件具有焦点时生成。而是使用。即使组件没有焦点,也可以调用该操作。