JButton doClick()执行最后点击的按钮

时间:2018-05-18 15:03:05

标签: java swing jframe jbutton keylistener

这是我用来检查按键的代码块。如果我按'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:经过一些更多的测试后,问题似乎是,当点击框架中的任何内容时,监听器会中断。

  1. 计划启动
  2. 听众积极工作。
  3. 点击框架的任何组件,监听器中断
  4. 编辑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();
            } 
        });
    

1 个答案:

答案 0 :(得分:0)

我想出了这个问题。监听器停止工作,因为当单击按钮时,它变为焦点。我创建了一个扩展JButton的类,以便我的所有按钮具有相同的行为,并将以下代码行添加到其构造函数中;

setRequestFocusEnabled(false);

这样,在单击按钮后,JFrame保持聚焦状态,允许监听器按预期运行。