当我尝试实现KeyEventDispatcher
时遇到了一个小问题。按住键盘上的任意键将导致QuestGUI
在true和false之间切换。这意味着它会检查每次执行时是否按下了键。我想要的是当我按'A'时它会触发我的KeyEventDispatcher
处理的事件。然后它应该等待,直到按下下一个键。我的代码如下所示。
Test.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
一样。然后我需要为每个keybind和匹配它。然而,这感觉很笨拙。我预计KEY_PRESSED
会自动执行此操作。
答案 0 :(得分:2)
就个人而言,我更喜欢使用键绑定来做这种事情,这只是我,但你可以创建两个Action
,一个用于按下,一个用于释放,它只需要一个& #34;键"可以根据触发器将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
中以检测何时按下/释放某些键...
就个人而言,我认为密钥绑定更容易管理,扩展和配置,但我想这一切都归结为上下文。