首先,感谢您花时间阅读我的问题,我很感激。
这是我现在所拥有的概述:
我正在编写一个 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/