Java 密钥侦听器和密钥绑定不适用于每次编译
基本上,我已经创建了一个连接到JPanel的密钥侦听器。。有时候,当我编译并运行它时,它确实工作得很好,没有任何问题。。 但有时当我编译时,它就不起作用了。它不能识别按键 以下是我在JPanels更新方法中用于密钥侦听器的代码:Java 密钥侦听器和密钥绑定不适用于每次编译,java,swing,keylistener,key-bindings,Java,Swing,Keylistener,Key Bindings,基本上,我已经创建了一个连接到JPanel的密钥侦听器。。有时候,当我编译并运行它时,它确实工作得很好,没有任何问题。。 但有时当我编译时,它就不起作用了。它不能识别按键 以下是我在JPanels更新方法中用于密钥侦听器的代码: if(keyListener.getMovingRight() == KeyEvent.VK_RIGHT){ player.playerMoveRight(); } if(keyListener.getMovin
if(keyListener.getMovingRight() == KeyEvent.VK_RIGHT){
player.playerMoveRight();
}
if(keyListener.getMovingLeft() == KeyEvent.VK_LEFT){
player.playerMoveLeft();
}
if(keyListener.getMovingUp() == KeyEvent.VK_UP){
player.playerMoveUp();
}
if(keyListener.getMovingDown() == KeyEvent.VK_DOWN){
player.playerMoveDown();
}
上面的代码知道是否按下了该类中的键:
public class KeyBoard implements KeyListener {
private int playerMoveUp;
private int playerMoveDown;
private int playerMoveLeft;
private int playerMoveRight;
public KeyBoard(){
playerMoveUp = 0;
playerMoveDown = 0;
playerMoveLeft = 0;
playerMoveRight = 0;
}
@Override
public void keyTyped(KeyEvent keyEvent) {
}
@Override
public void keyPressed(KeyEvent keyEvent) {
//Switch statement to get which keys were pressed
switch(keyEvent.getKeyCode()){
case KeyEvent.VK_UP:
playerMoveUp = keyEvent.getKeyCode();
break;
case KeyEvent.VK_DOWN:
playerMoveDown = keyEvent.getKeyCode();
break;
case KeyEvent.VK_LEFT:
playerMoveLeft = keyEvent.getKeyCode();
break;
case KeyEvent.VK_RIGHT:
playerMoveRight = keyEvent.getKeyCode();
break;
}
}
@Override
public void keyReleased(KeyEvent keyEvent) {
//Switch statement to get which keys were released
switch(keyEvent.getKeyCode()){
case KeyEvent.VK_UP:
playerMoveUp = 0;
break;
case KeyEvent.VK_DOWN:
playerMoveDown = 0;
break;
case KeyEvent.VK_LEFT:
playerMoveLeft = 0;
break;
case KeyEvent.VK_RIGHT:
playerMoveRight = 0;
break;
}
}
public int getMovingUp(){
return playerMoveUp;
}
public int getMovingDown(){
return playerMoveDown;
}
public int getMovingLeft(){
return playerMoveLeft;
}
public int getMovingRight(){
return playerMoveRight;
}
}
当然,我通过这样做向JPanel添加了关键侦听器:
panel.addKeyListener(KeyBoardClasshere);
因为它不能正常工作,所以我尝试了另一种叫做键绑定的东西,因为我听说这会增加我的机会
我在我的JPanel类中添加了这个,并在update方法中注释掉了密钥侦听器:
这也是可行的,但有时当我编译并运行项目时,它不起作用,如果我终止项目,然后再次运行它,它就会起作用。。我的机会太奇怪了。。有人有什么建议吗
编辑:
在这个问题上,我遵循了答案:
我确实通过单击按钮和空格键得到了响应,但没有单击更新方法中使用的键。。现在,在我添加按钮后,有时运行应用程序时,我得到的只是一个灰色窗口,需要重新启动几次才能使其恢复正常,就像我链接的问题一样。尝试添加
setFocusable(true);
添加到JPanel的构造函数。尝试添加
setFocusable(true);
添加到JPanel的构造函数。通过添加
frame.revalidate()解决了此问题代码>在我的游戏循环中。
谢谢你的帮助 通过添加frame.revalidate()解决了这个问题代码>在我的游戏循环中。
谢谢你的帮助 您是否尝试过将KeyListener添加到框架而不是面板?不确定这是否有效,但值得一试。您会看到一个奇怪的错误,它不是每次运行程序时都会发生,而是间歇性地发生。这向我表明,您可能有一个Swing线程问题,在某些地方,您的代码可能没有适当地遵守Swing线程规则。您是否注意在EDT(Swing事件调度线程)上启动GUI?你能创建并发布一个演示你的问题的报告吗?然后,是的,请在EDT上开始,看看这是否有帮助。您在这方面没有什么损失。@Rakso:如果只是这么简单、快速和简单,我会的,但解决方案将意味着检查您的代码,确保所有与Swing相关的调用都在EDT上进行,并且所有不再在后台线程中运行非Swing调用,因此,解决方案必然完全取决于程序的结构。作为第一个测试,您最好再次尝试在EDT上启动GUI,然后调整它直到它运行。要捕获EDT冲突,请尝试本文中引用的方法之一。您是否尝试将KeyListener添加到框架而不是面板?不确定这是否有效,但值得一试。您会看到一个奇怪的错误,它不是每次运行程序时都会发生,而是间歇性地发生。这向我表明,您可能有一个Swing线程问题,在某些地方,您的代码可能没有适当地遵守Swing线程规则。您是否注意在EDT(Swing事件调度线程)上启动GUI?你能创建并发布一个演示你的问题的报告吗?然后,是的,请在EDT上开始,看看这是否有帮助。您在这方面没有什么损失。@Rakso:如果只是这么简单、快速和简单,我会的,但解决方案将意味着检查您的代码,确保所有与Swing相关的调用都在EDT上进行,并且所有不再在后台线程中运行非Swing调用,因此,解决方案必然完全取决于程序的结构。作为第一个测试,您最好再次尝试在EDT上启动GUI,然后调整它直到它运行。要捕获EDT冲突,请尝试本文中引用的一种方法。我的构造函数中已经有了这种方法。。我确实有“requestFocusInWindow();”,我的构造函数中已经有了。。我确实有“requestFocusInWindow();”@HovercraftFullOfEels在添加这个之后,它确实开始正常工作了。我不怀疑这一点,但它闻起来像是一个隐藏更大更有害的问题的乱七八糟的东西,主要是一个隐藏线程问题的乱七八糟的东西。如果我是对的,那么我们肯定会再次看到您的GUI间歇性出现的另一个问题。不过我希望我错了。@hovercraftfullofels在添加这个之后,它确实开始正常工作了。我不怀疑这一点,但它闻起来像是一个隐藏更大更有害的问题的乱七八糟的东西,主要是一个隐藏线程问题的乱七八糟的东西。如果我是对的,那么我们肯定会再次看到您的GUI间歇性出现的另一个问题。我希望我错了。