4

getFocusOwner() の作業に助けが必要です。Java で作成した数独ゲームがあり、プログラムに矢印キー ナビゲーションを追加したいと考えています。いくつかの調査を行ったところ、フォーカス システムを使用することが最善の方法であることがわかりました (そうでない場合は、より良い方法を教えてください。調査できます)。

さて、テスト目的で、JTextField を拡張するカスタム クラスである SetField にフォーカスを設定しようとしています (数字以外の入力を無効にしたかったため)。フォーカス可能に設定されています。グリッドの中央にある SetField で requestFocusInWindow() を呼び出すと、そのコンポーネントにフォーカスが設定されます。フォーカスのあるコンポーネントを取得しようとすると、問題が発生します。

これは、getFocusOwner() メソッドをテストするために行っていることです。

sGrid[40].requestFocusInWindow();

    try{
        System.out.println(this.getFocusOwner().getClass().getSimpleName());
    } catch(NullPointerException e){
        e.printStackTrace();
    }

これをどのコンポーネントで試しても、常に null ポインター例外が発生します。プログラムの JButtons、JLabels、さらには JPanels でも試してみました。ただし、フォーカスはコンポーネントに設定されています。意図した SetField でキャレットが点滅していることがわかります。私が間違っていることはありますか?助けてくれてありがとう。

4

3 に答える 3

1

プログラムに矢印キーナビゲーションを追加したい。

キーバインディングを使用する必要があります。基本的な「ChangeFocusAction」を作成します。KeyStrokeにマップできるこのクラスの4つのインスタンスが必要になります。

81個​​のテキストフィールドの配列があると仮定すると、フォーカスを変更する方法をアクションに指示する整数値を使用してアクションを作成できます。例えば:

右=-1
左=1
上=-9
下=9

ActionEventのソースには、フォーカスのあるテキストフィールドが含まれます。次に、arryを検索して、そのテキストフィールドのオフセットを見つけます。次に、上からint値をインデックスに追加し、そのコンポーネントにフォーカスを要求します。

于 2011-01-11T02:20:46.100 に答える
1

問題を発見しただけです。これに問題がある他の人は、(Window).getMostRecentFocusOwner() を使用してみてください。これは私にとってはうまくいきました。

于 2011-01-11T03:09:05.170 に答える
1
  1. 数値のみを許可するカスタム コンポーネントの代わりに、JFormattedTextField を使用します。
  2. KeyListener、MouseListener を追加してみませんか? フォーカスで何をしているのか正確にはわかりませんが、奇妙に思えます。
于 2011-01-11T02:02:34.233 に答える