JFrame の KeyListener を実装しようとして、開発者は不可解な問題に遭遇しました。KeyListener が応答していないように見えるということです。 、キーを押してもコンソールにメッセージは表示されません。 JFrame に焦点が当てられていないのではないかと考え、開発者は支援を求めました。
慎重に調査した結果、KeyListener が実際に正しく追加されており、フォーカスが適切に設定されていることが判明しました。ただし、重要な要素が欠けていました。それは、キー イベントを KeyListener に伝播するメカニズムです。
解決策は、KeyEventDispatcher を使用することにあります。このディスパッチャは、JFrame 内の内部クラスとして定義し、KeyboardFocusManager に追加できます。ディスパッチャーのdispatchKeyEventメソッドは、keyPressed、keyrelease、keyTypedを含むすべてのキーイベントを処理します。このメカニズムを実装することで、KeyListener はキー イベントを効率的にキャプチャして応答できるようになります。
以下は、KeyEventDispatcher を組み込んだ変更されたコード サンプルです。
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); } }
この変更により、KeyListener は次のようになります。主要なイベントを正常に受信して処理し、期待どおりの出力がコンソールに表示されます。
以上がJFrame の KeyListener がキーの押下に応答しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。