JFrame の KeyListener が応答しない: 包括的なソリューション
Java JFrame で KeyListener からの応答がない場合は、いくつかの可能性が考えられます。原因。コンストラクターでリスナーを正常に初期化しても、フォーカスが JFrame に向けられず、キー イベントの受信が妨げられる場合があります。
KeyEventDispatcher の実装
このフォーカス関連の問題を回避するには、別のアプローチとしてカスタム KeyEventDispatcher を KeyboardFocusManager に追加します。このアプローチは、コンポーネントごとに個別にリスナーを登録するのではなく、複数のコンポーネントのリスナーを登録する場合に特に有益です。実装例を次に示します。
public class MyFrame extends JFrame { private class MyDispatcher implements KeyEventDispatcher { @Override public boolean dispatchKeyEvent(KeyEvent e) { if (e.getID() == KeyEvent.KEY_PRESSED) { System.out.println("tester"); } else if (e.getID() == KeyEvent.KEY_RELEASED) { System.out.println("2test2"); } else if (e.getID() == KeyEvent.KEY_TYPED) { System.out.println("3test3"); } return false; } } public MyFrame() { add(new JTextField()); System.out.println("test"); KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); manager.addKeyEventDispatcher(new MyDispatcher()); } public static void main(String[] args) { MyFrame f = new MyFrame(); f.pack(); f.setVisible(true); } }
この変更された例では、カスタム KeyDispatcher クラス MyDispatcher が実装されています。このクラス内のdispatchKeyEventメソッドは、さまざまなキーイベント(押された、放された、入力された)を処理し、適切なメッセージをコンソールに出力します。このディスパッチャを KeyboardFocusManager に登録すると、フォーカスされたコンポーネントに関係なく、すべてのキー イベントがインターセプトされて処理されるようになります。これにより、個々のコンポーネントでの複数のリスナーの必要性が効果的に置き換えられます。
結論
KeyEventDispatcher を実装すると、JFrame で応答しない KeyListener の問題を効果的に解決できます。このアプローチにより、フォーカスに関係なく主要なイベントを処理できるようになり、イベント駆動型アプリケーションに、より包括的で柔軟なソリューションが提供されます。
以上がJFrame の KeyListener が応答しないのはなぜですか? どうすれば修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。