1

4 つのラジオ ボタンがあり、それらはすべて radioGroup の一部です。各ボタンにホットキーをリンクするにはどうすればよいですか? 私がやりたいことは、キー「1」、「2」、「3」、および「4」を対応する各ラジオボタンにリンクすることです。

buttonGroup1 = new javax.swing.ButtonGroup();
quizBut1 = new javax.swing.JRadioButton();
quizBut2 = new javax.swing.JRadioButton();
quizBut4 = new javax.swing.JRadioButton();
quizBut3 = new javax.swing.JRadioButton();
4

3 に答える 3

4

KeyListenerを使用します。Swing のほぼすべてのコンポーネントにアタッチできます。

おそらく、アプリケーションのプライマリ JFrame に KeyListener をアタッチして、すべてのキー押下をキャプチャし、押されたキーに応じて、それに応じて UI の変更をトリガーします (たとえば、特定のラジオ ボタンの選択)。

KeyListener を、ほぼ常にキーボード フォーカスを持つコンテナにアタッチすることが重要です。この場合、KeyListener をラジオ ボタン自体にアタッチすることはできません。KeyListener は、自分がフォーカスしているイベントしか認識しないためです。KeyEvent が特定のオブジェクトに吸収されない場合、KeyEvent はその親コン​​ポーネントに渡され、そのイベントで何かを行う必要があるかどうかが確認され、アプリケーションのウィンドウまでずっと続きます。KeyListener がイベントに対して何も実行せず、コンポーネント階層のルートに到達した場合、キーを押しても何も起こらず、イベントは基本的に破棄されます。

于 2012-09-08T14:18:01.797 に答える
3

同様に、ActionMapKeyStrokeも使用できます。いくつかの大まかなスニペット、それを変更します:

    class KeyAction extends AbstractAction {
        JRadioButton b;
        KeyAction(JRadioButton b) {
            super();
            this.b = b;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            b.setSelected(true);
        }
    }

    b1.setAction(new KeyAction(b1));
    b2.setAction(new KeyAction(b2));
    b3.setAction(new KeyAction(b3));

    bindHotkey('1', "1", b1.getAction());
    bindHotkey('2', "2", b2.getAction());
    bindHotkey('3', "3", b3.getAction());
            ..............

void bindHotkey(char keyChar, String name, Action action) {
    KeyStroke ks = KeyStroke.getKeyStroke(keyChar);
    container.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ks, name);
    container.getActionMap().put(name, action);
}
于 2012-09-08T14:52:01.687 に答える
0

これも使用できます http://pastebin.com/UvkjD0g5

于 2012-09-08T15:03:31.537 に答える