【问题标题】:JButton doClick() performs the last clicked buttonJButton doClick() 执行最后点击的按钮
【发布时间】:2018-10-29 01:36:26
【问题描述】:

这是我用来检查按键的代码块。如果我按下“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. 单击框架的任何组件,侦听器中断

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

【问题讨论】:

标签: java swing jframe jbutton keylistener


【解决方案1】:

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

setRequestFocusEnabled(false);

这样,在单击按钮后,JFrame 仍保持焦点,从而允许侦听器按预期运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2017-06-11
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多