当我尝试实现KeyEventDispatcher
时,我遇到了一个小问题。按住键盘上的任意键都会导致 QuestGUI 在 true 和 false 之间切换。这意味着它会在每次执行时检查是否按下了该键。我想要的是,当我按“A”时,它将触发一个事件供我的 KeyEventDispatcher
处理。然后它应该等到按下下一个键。我的代码如下所示。
测试.java
package core;
import java.awt.KeyboardFocusManager;
import javax.swing.JFrame;
public class Test
{
public Test (){
JFrame frame = new JFrame ();
frame.setResizable (false);
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo (null);
frame.pack ();
frame.setSize (800, 600);
frame.setVisible (true);
KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(new KeyManager());
}
public static void main (String[] args){
new Test();
}
}
KeyManager.java
package core;
import java.awt.KeyEventDispatcher;
import java.awt.event.KeyEvent;
public class KeyManager implements KeyEventDispatcher {
private boolean QuestGUI;
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED) {
QuestGUI = !QuestGUI;
System.out.println("QuestGUI" + QuestGUI);
}
return false;
}
}
可以通过添加一个 boolean 值来检查 Q 是否被按下来解决,只有当 Q 被释放时它才会起作用。就像PRESSED_Q
。然后我需要每个键绑定(bind)并与之匹配。然而,这感觉很笨拙。我预计 KEY_PRESSED
会自动执行此操作。
最佳答案
就我个人而言,我更喜欢对这种事情使用键绑定(bind),这只是我的想法,但是您可以创建两个 Action
,一个用于按下,一个用于释放,这只需一个“键” ” value 会将某种 Map
中的值(即 "Up"
)设置为 true
/false
取决于触发器,但这就是我......
核心问题是,KEY_PRESSED
事件将根据操作系统定期重复。这意味着您的 QuestGUI 值会不断翻转。您需要检测 KEY_PRESSED
和 KEY_RELEASED
事件并采取适当的操作,例如...
public class KeyManager implements KeyEventDispatcher {
private boolean QuestGUI;
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED && !QuestGUI) {
QuestGUI = true;
System.out.println("QuestGUI" + QuestGUI);
} else if (e.getID() == KeyEvent.KEY_RELEASED && QuestGUI) {
QuestGUI = false;
System.out.println("QuestGUI" + QuestGUI);
}
return false;
}
}
您还可以使用 KeyEvent#getKeyCode
值,将其放置在 List
或 Map
中来检测何时按下/释放某些按键...
就我个人而言,我认为按键绑定(bind)会更容易管理、扩展和配置,但我想这一切都取决于上下文。
关于java - 按下的按键相当于键入的按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28531349/