Java 密钥侦听器和密钥绑定不适用于每次编译

Java 密钥侦听器和密钥绑定不适用于每次编译,java,swing,keylistener,key-bindings,Java,Swing,Keylistener,Key Bindings,基本上,我已经创建了一个连接到JPanel的密钥侦听器。。有时候,当我编译并运行它时,它确实工作得很好,没有任何问题。。 但有时当我编译时,它就不起作用了。它不能识别按键 以下是我在JPanels更新方法中用于密钥侦听器的代码: if(keyListener.getMovingRight() == KeyEvent.VK_RIGHT){            player.playerMoveRight();        }        if(keyListener.getMovin

基本上,我已经创建了一个连接到JPanel的密钥侦听器。。有时候,当我编译并运行它时,它确实工作得很好,没有任何问题。。 但有时当我编译时,它就不起作用了。它不能识别按键

以下是我在JPanels更新方法中用于密钥侦听器的代码:

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间歇性出现的另一个问题。我希望我错了。