Java:点击按钮后JPanel无法接收按键事件(没有注册的事件监听器)?

标签 java swing jbutton keylistener clicking

首先,感谢您花时间阅读我的问题,我很感激。

这是我现在所拥有的概述:

我正在编写一个 slider 益智游戏,3 x 3 使用按钮作为网格单元。我已经向包含这些按钮的 JPanel 添加了一个按键监听器,它们可以很好地响应键盘事件。

但是,这个问题有点奇怪,我还没有真正能够查明为什么它会呈现这种不稳定的行为。单击这些“按钮”之一后,这些按钮都没有注册事件监听器,所有按钮都不会移动,但是当您跟随一个键事件时,键会变得无响应。

我的问题是:我知道这很含糊,但这是否提醒任何人这是一个 Java 问题,还是听起来我的错误代码是这一切的幕后黑手?

我真的很乐意接受任何建议,因为这已经困扰我大约一个星期了,而且我仍然不知道是什么导致了这个问题。

再次感谢您花时间阅读本文。

@trashgod:是的,当然。

public class Test2 extends JPanel{
    JButton a = new JButton("A");

    Test2(){
        setFocusable(true);
        // Set layout to grid layout
        setLayout(new GridLayout(3, 3));
        // Add button
        //a.setEnabled(false);
        add(a);

        // Register key event which shifts it to the next cell when the right arrow is pressed
        addKeyListener(new KeyAdapter(){
            public void keyPressed(KeyEvent e){
                if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                    remove(a);
                    JButton b = new JButton("B");
                    //b.setEnabled(false);
                    add(b);
                    add(a);
                    validate();

                }
            }
        });
    }
}

代码段作用:JPanel接收按键事件,准确的说是左方向键,去掉按钮'a',并添加一个新的按钮'b',每次都跟在按钮'a'之后。但是,如果您尝试运行该程序,在您单击一个按钮后,它就会停止监听按键事件。

我刚刚考虑了一下,这可能与 JPanel 中失去焦点有关吗?如果可以,需要注意哪些具体的方法来恢复失去的焦点?

谢谢!

(顺便说一句,setEnabled 评论是我通过简单地禁用按钮来解决这个问题的尝试,但它仍然没有解释如何将失去的焦点恢复到 JPanel 如果这是手头的问题。)

最佳答案

我们只需在每个按钮上调用 setFocusable(false) 即可将焦点保持在 JPanel 上:

button1.setFocusable(false);button2.setFocusable(false);

等等

这将允许添加 keyListeners 的 JPanel 保持焦点。

关于Java:点击按钮后JPanel无法接收按键事件(没有注册的事件监听器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8622962/

相关文章:

java - java中的hashmap在哪些情况下会丢失一些条目?

javascript - 如何将js变量发送到Spring Controller ?

java - JTable改变鼠标光标

java - 将 2 个标签放入 jframe 边框布局的中间

java - 如何将光标定位在默认位置?

java - 奇怪的结果文件

java - 在JFrame中添加图像,点击时图像

java - 如何在 Java 中使用 KeyPressed

java - 无法实例化私有(private)类

java - 第二个 JFrame 中的组件未显示