Java JButton doClick()执行上次单击的按钮
这是我用来检查按键的代码块。如果我按下“esc”键,JFrame将关闭。但是,如果我按下“空格”键,侦听器将执行最后一次按下的JButton,而不是我要它单击的特定按钮。除非之前单击了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) {
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:好的,经过一些测试之后,问题似乎是当点击帧中的任何内容时侦听器会中断
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仅在组件具有焦点时生成。而是使用。即使组件没有焦点,也可以调用该操作。