JFrame
かなり複雑なSwingUIに蓄積される複数のパネルがあります。コンポーネントのフォーカスに関係なく、[ENTER]キーなどの特定のキーを押すと、リスナーが反応するように、キーボードのサポートを追加したいと思います。
にを追加しようとしKeyListener
ましたが、フォーカスを変更するJFrame
別のを選択すると機能しません。JComponent
これを行う適切な方法はありますか?
JFrame
かなり複雑なSwingUIに蓄積される複数のパネルがあります。コンポーネントのフォーカスに関係なく、[ENTER]キーなどの特定のキーを押すと、リスナーが反応するように、キーボードのサポートを追加したいと思います。
にを追加しようとしKeyListener
ましたが、フォーカスを変更するJFrame
別のを選択すると機能しません。JComponent
これを行う適切な方法はありますか?
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.
}
});
私のやり方は、JFrameをフォーカス可能にして、それにリスナーを追加することです。次に、すべてのJFrameの子を繰り返し処理し、他のすべてをフォーカスできないようにします。もちろん、これはテキストボックスなどがない場合にのみ機能し、編集できなくなります。