まず第一に、私の質問を読んでくれてありがとう、感謝しています。
これが私が今持っているものの概要です:
ボタンをグリッドセルとして使用して、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 に復元する方法はまだ説明されていません。)