我有一个JFrame设置,在运行时添加了一个keyListener,但是当帧加载时,会有一个短暂的时刻接收输入,然后它就会停止接收所有输入,这里是{{ 1}}代码:
Keyboard.java
这是package uk.connorwright.rain.input;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Keyboard implements KeyListener {
private boolean[] keys = new boolean[120];
public boolean up, down, left, right;
public void update() {
up = keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W];
down = keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S];
left = keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A];
right = keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D];
}
public void keyPressed(KeyEvent e) {
keys[e.getKeyCode()] = true;
}
public void keyReleased(KeyEvent e) {
keys[e.getKeyCode()] = false;
}
public void keyTyped(KeyEvent e) {
}
}
中与键盘输入相关的代码:
Game.java
...
private Keyboard key;
....
public void update(){
key.update();
key = new Keyboard();
frame.addKeyListener(key);
...
if (key.up) {
y--;
}
if (key.down) {
y++;
}
if (key.left) {
x--;
}
if (key.right) {
x++;
}
}
答案 0 :(得分:2)
KeyListener
是一个糟糕的选择,它负责在组件可聚焦且有焦点时为组件生成事件。
相反,您应该考虑使用Key Bindings API,它为您提供了决定应该在哪个焦点级别生成关键事件的方法
有关详细信息,请参阅How to Use Key Bindings。
答案 1 :(得分:1)
我还没有对此进行测试,但我认为您的KeyListener可能需要一个具有键盘焦点的组件,而JFrame永远不会有这样的组件。只有框架的子组件才会有焦点。
从教程中: https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html
具体而言,组件使用键盘触发键事件 用户按下或释放键盘键时进行对焦。详细说明 有关焦点的信息,请参阅如何使用焦点子系统。
如果你没有焦点,那么没有关键事件。