0

JFrameかなり複雑なSwingUIに蓄積される複数のパネルがあります。コンポーネントのフォーカスに関係なく、[ENTER]キーなどの特定のキーを押すと、リスナーが反応するように、キーボードのサポートを追加したいと思います。

にを追加しようとしKeyListenerましたが、フォーカスを変更するJFrame別のを選択すると機能しません。JComponent

これを行う適切な方法はありますか?

4

2 に答える 2

1

KeyEventDispatcherをKeyboardFocusManagerに登録すると、フォーカスされたコンポーネントに送信される前に、すべてのキーイベントを確認できます。イベントを変更したり、フォーカスされたコンポーネントに配信されないようにすることもできます。

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
    new KeyEventDispatcher() {
        public boolean dispatchKeyEvent(KeyEvent e) {
            //Get the char which was pressed from the KeyEvent:
            e.getKeyChar();
            //Return 'true' if you want to discard the event.
            return false;
        }
    });

1つのウィンドウ/コンポーネントまたは特定のキーのキー入力を取得するだけの場合は、kleopatraが提案するようにKeyBindingsを使用できます。Enterキーを押したときにキーボードイベントに登録する方法の例として(KeyEventによって提供される任意のVK_を使用できます。修飾子[alt、ctrlなど]にはInputEventを参照してください)を参照してください。

JFrame frame = new JFrame(); //e.g.
JPanel content = (JPanel)frame.getContentPane(); 
content.getInputMap().put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ENTER,0),"enterDown");
content.getActionMap().put("enterDown",new AbstractAction() {
    private static final long serialVersionUID = 1l;
    @Override public void actionPerformed(ActionEvent e) {
        //This action is called, as the Enter-key was pressed.
    }
});
于 2012-10-29T01:05:48.147 に答える
0

私のやり方は、JFrameをフォーカス可能にして、それにリスナーを追加することです。次に、すべてのJFrameの子を繰り返し処理し、他のすべてをフォーカスできないようにします。もちろん、これはテキストボックスなどがない場合にのみ機能し、編集できなくなります。

于 2012-10-29T01:05:14.533 に答える