【发布时间】: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:好的,经过更多测试后,问题似乎是当单击框架中的任何内容时侦听器中断。
- 计划启动
- 侦听器处于活动状态且正在工作。
- 单击框架的任何组件,侦听器中断
编辑 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();
}
});
【问题讨论】:
-
您可以尝试在您的
if语句中插入ke.consume()行作为空格键。可能这会对你有所帮助。如果不是这样,请提供minimal reproducible example,以便我们也可以重现(并更好地理解)您的问题。 -
不要使用 KeyListener。仅当组件具有焦点时才会生成 KeyEvent。而是使用Key Bindings。即使组件没有焦点,也可以调用 Action。
标签: java swing jframe jbutton keylistener