我想要一个程序,该程序将使用KeyEvent读取一个文件中按下的键,然后在下一个文件中将其写入控制台。我已经设置了Q&W键,但是每当我尝试运行该程序时,它都会向“ Key Q Pressed”和“ Key W Pressed”发送垃圾邮件
我试过将KeyPressed更改为KeyTyped,什么也没有。 KeyPressed,KeyTyped和KeyReleased的单独功能,什么也没有。删除CHAR_UNDEFINED,什么也没有。
主要IsKeyPressed.java
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
public class IsKeyPressed {
private static volatile boolean qPressed = false;
private static volatile boolean wPressed = false;
public static boolean isQPressed() {
synchronized (IsKeyPressed.class) {
return qPressed;
}
}
public static boolean isWPressed() {
synchronized (IsKeyPressed.class) {
return wPressed;
}
}
public static void main(String[] args) {
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent ke) {
synchronized (IsKeyPressed.class) {
switch(ke.getID()) {
case KeyEvent.KEY_PRESSED:
if (ke.getKeyCode() == KeyEvent.VK_W) {
wPressed = true;
} else if (ke.getKeyCode() == KeyEvent.VK_Q) {
qPressed = true;
}
break;
case KeyEvent.KEY_RELEASED:
if (ke.getKeyCode() == KeyEvent.VK_W) {
wPressed = false;
} else if (ke.getKeyCode() == KeyEvent.VK_Q) {
qPressed = false;
}
break;
}
return false;
}
}
});
}
public void keyTyped(KeyEvent ke) {
//test
}
public void keyPressed(KeyEvent ke) {
//test
}
public void keyReleased(KeyEvent ke) {
//test
}
}
Test.java中的公共类
static boolean randomVariableName = true;
public static void main(String[] args) {
while (randomVariableName == true) {
if (IsKeyPressed.isWPressed()); {
System.out.println("keydown.W");
}
if (IsKeyPressed.isQPressed()); {
System.out.println("keydown.Q");
}
}
}
我希望在键盘上按Q可以使控制台打印
keydown.Q
,但是它只是垃圾邮件keydown.Q
和keydown.W
最佳答案
以下使您的代码成为垃圾邮件:
if (IsKeyPressed.isWPressed()); {
System.out.println("keydown.W");
}
isWPressed()之后的分号终止表达式,因此始终为true。
没有垃圾邮件:
if (IsKeyPressed.isWPressed()) {
System.out.println("keydown.W");
}
另外,我认为您将不可能通过KeyboardFocusManager获取键。
至少您必须启动Swing JFrame或AWT窗口才能获取事件。为此,您还可以简单地向组件(例如JTextField)添加键侦听器或键映射。
-恕我直言-使用Java无法在您自己的应用程序之外获取事件。