4

まず第一に、私の質問を読んでくれてありがとう、感謝しています。

これが私が今持っているものの概要です:

ボタンをグリッドセルとして使用して、3 x 3 のスライダー パズル ゲームを作成しています。これらのボタンを保持するキー リスナーを に追加しました。キー リスナーはJPanelキーボード イベントに正常に応答します。

ただし、この問題はやや特殊であり、なぜこの不安定な動作が発生するのかを正確に突き止めることはできませんでした。イベントリスナーが登録されていない「ボタン」のいずれかをクリックした後、ボタンは移動しませんが、キーイベントでそれに続くと、キーが応答しなくなります。

私の質問は次のとおりです。これがかなり漠然としていることはわかっていますが、これは Java の問題であると誰にでも警告を発しますか、それとも私の欠陥のあるコードがこれらすべての背後にあるように聞こえますか?

これは約1週間私を悩ませてきたので、私はどんな提案にも本当にオープンです、そして私はまだ問題の原因がわからない.

繰り返しますが、これを熟読するために時間を割いていただきありがとうございます。

@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);

これにより、keyListeners が追加された JPanel がフォーカスを維持できるようになります。

于 2014-09-01T19:17:29.687 に答える
2

のすべてのキーにアクセスできるわけではありません。その一部は、 の組み込みショートカットとして登録KeyListenerされてます。むしろJComponentsJComponent's typeLook and FeelKeysKeyListener

キーの実例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 に答える