java - KeyListener 无法识别何时按下某个键
问题描述
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Tastatur implements KeyListener {
private boolean[] keys = new boolean[66568];
private boolean left, right, up, down, fw, bw;
public void update() { //Den boolean-Variablen werden keys zugewiesen
this.left = this.keys[KeyEvent.VK_LEFT] || this.keys[KeyEvent.VK_A];
this.right = this.keys[KeyEvent.VK_RIGHT] || this.keys[KeyEvent.VK_D];
this.fw = this.keys[KeyEvent.VK_UP] || this.keys[KeyEvent.VK_W];
this.bw = this.keys[KeyEvent.VK_DOWN] || this.keys[KeyEvent.VK_S];
this.up = this.keys[KeyEvent.VK_SPACE];
this.down = this.keys[KeyEvent.VK_C] || this.keys[KeyEvent.VK_CONTROL];
}
public boolean getLeft() {
return this.left;
}
public boolean getRight() {
return this.right;
}
public boolean getFW() {
return this.fw;
}
public boolean getBW() {
return this.bw;
}
public boolean getUp() {
return this.up;
}
public boolean getDown() {
return this.down;
}
@Override
public void keyPressed(KeyEvent arg0) {
keys[arg0.getKeyCode()] = true;
}
@Override
public void keyReleased(KeyEvent arg0) {
keys[arg0.getKeyCode()] = false;
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
所以,我的问题是,如果我在某处使用例如 getLeft() 它总是返回 false,即使按下了键。我使用它的方法完全没问题(如果我手动将 getleft 设置为 true,则其他方法有效)并且我将错误追踪到此类。看起来,它根本不识别任何键盘输入。所以错误一定是在 KeyPressed、KeyReleased 或 update() 中的某个地方,对吧?正如你所看到的,我没有那么有经验,所以我真的很感激一些帮助。请帮我找出我的 KeyListener 不起作用的原因。
提前致谢!
解决方案
需要添加 GUI 并将侦听器绑定到某些 GUI 组件(TextArea in
)。侦听器应该包含逻辑(如果按下某个键该怎么办)。贝娄是一个最小的例子。
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class TestKey extends JFrame implements KeyListener{
private static final long serialVersionUID = 1L;
JTextArea out;
public static void main(String[] args)
{
new TestKey();
}
public TestKey()
{
this.setSize(400, 200);
setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
JTextArea in = new JTextArea(3,30);
out = new JTextArea(3,30);
add(in);
add(out);
in.addKeyListener(this);
setVisible(true);
}
@Override
public void keyTyped(KeyEvent e){
}
@Override
public void keyPressed(KeyEvent e) {
out.setText(Character.toString(e.getKeyChar()));
if(e.getKeyCode()==37)
{
out.setText("left");
}
else if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
out.setText("right");
}
System.out.println(e);
}
@Override
public void keyReleased(KeyEvent e) {
}
}
输出
推荐阅读
- snakemake - Snakemake:在一条规则中重命名 fastQC 输出
- mysql - 在select语句mysql中替换具有不同位置的多个关键字
- dart - 如何在多个项目之间分配空间
- php - 我需要一个端口吗
- c# - 所有这些 DLL 来自哪里?
- android - 如何访问另一个 Android 应用程序的通知渠道?
- winforms - 如何使用 Visual Studio 2017 在 Windows 窗体应用程序中查看和编辑 Visual Basic Power Pack 形状?
- macos - 如何对 AVAssetWriter 输出进行颜色管理
- linux - 如何在 Linux 的子目录中打开最新文件?
- java - 如何处理存储在非常大的未分区 Hive 表的一行中的 JSON