4

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

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

我正在编写一个滑块益智游戏,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。)

4

2 回答 2

3

setFocusable(false)我们可以通过调用每个按钮来保持对 JPanel 的关注:

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

ETC

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

于 2014-09-01T19:17:29.687 回答
2

不是所有的 Key 都可以访问KeyListener,其中一部分被注册为内置的快捷键 for JComponents,depends ofJComponent's type和 used Look and Feel,如果你想Keys从键盘监听,那么你必须实现KeyBindings, Swing JComponents 被指定使用这个监听器比较起来KeyListener

关键的工作示例A

import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test2 extends JPanel {

    private static final long serialVersionUID = 1L;
    private JButton a = new JButton("A");

    public Test2() {
        setFocusable(true);
        setLayout(new GridLayout(3, 3));
        a.setEnabled(false);
        add(a);
        addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_A) {
                    remove(a);
                    JButton b = new JButton("B");
                    add(b);
                    add(a);
                    revalidate();
                    repaint();
                }
            }
        });
    }

    public static void main(String... args) {
        JFrame frame = new JFrame("");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new Test2());
        frame.pack();
        frame.setVisible(true);
    }
}
于 2011-12-24T06:25:50.513 回答