9

JFrameから拡張されたクラスを使用するサブクラスがありますJPanel

public class HelloWorld extends JPanel implements KeyListener

のオブジェクトをHelloWorldフレームに追加します- app.add(helloWorld);。さて、キーボードのキーを押すと、どのKeyListenerメソッドも呼び出されhelloWorldず、ウィンドウフォーカスがないようです。呼び出しも試みましhelloWorld.requestFocusInWindow();たが、応答しません。

キーの押下に応答させるにはどうすればよいですか?

4

4 に答える 4

19

パネル自体がそのパネルになるように設定しましたKeyListenerか?HelloWorldまた、おそらくそのパネルをフォーカス可能に設定する必要があります。このコードでテストしたところ、正常に動作しているようです

class HelloWorld extends JPanel implements KeyListener{
    public void keyTyped(KeyEvent e) {
        System.out.println("keyTyped: "+e);
    }
    public void keyPressed(KeyEvent e) {
        System.out.println("keyPressed: "+e);
    }
    public void keyReleased(KeyEvent e) {
        System.out.println("keyReleased: "+e);
    }
}

class MyFrame extends JFrame {
    public MyFrame() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(200,200);

        HelloWorld helloWorld=new HelloWorld();

        helloWorld.addKeyListener(helloWorld);
        helloWorld.setFocusable(true);

        add(helloWorld);
        setVisible(true);
    }
    public static void main(String[] args) {
        new MyFrame();
    }
}
于 2012-07-14T21:31:22.693 に答える
12

JPanel は、デフォルトではフォーカス可能ではありません。つまり、フォーカス関連のイベントに応答できません。つまり、キーイベントに応答できません。

ペインのFocusableをtrueに設定して、もう一度やり直すことをお勧めします。最初にパネルをクリックして、フォーカスがあることを確認してください。

ただし、ユーザーがフォームをナビゲートするときにパネルが入力フォーカスを受け取り、どこかでフォーカスが失われたように見えるため、奇妙なフォーカストラバーサルの問題が発生することを理解してください。

また、KeyListenerこの種の状況では、s は信頼できない傾向があります (フォーカス マネージャーの動作方法が原因です)。

于 2012-07-14T21:17:39.283 に答える
1

簡単に追加する必要があります

addKeylistener(new HelloWorld());
于 2014-02-18T09:57:23.960 に答える