4

Swingを使って電卓を作っています。これまで、BorderLayoutを備えたJFrameで構成されるGUIを作成し、その中央に、JLabel(電卓の画面を表す)といくつかのJButton(キーを表す)を持つJPanelを配置しました。

電卓がキーボードから直接入力を受信できるようにしたいので、JFrameを拡張するクラスにメソッドaddKeyListenerを含め、KeyListenerを実装するクラスのオブジェクトへの参照を引数として配置しました。

アプリケーションを実行すると、JButtonの1つをクリックするまで、キーボード入力を受け入れます。その後、キーボードの使用は機能しなくなります。

問題はフォーカスにあると思いますが、アプリケーションの任意の場所をクリックして修正できる問題ではありません。次のコードを追加しました。

setFocusable(true);

JFrameに追加しましたが、役に立ちませんでした。Key Bindingsを使用する方が、KeyListenerを使用するよりも優れたオプションである可能性があることを読みましたが、このアプローチについてはよくわかりません。

4

2 に答える 2

4

Swingコンポーネントは軽量で使用されますKeyBindings。ここで、KeyListenersは重量のあるAWTコンポーネント用です。Swingコンポーネントと混合するとフォーカスの問題が発生することが知られています。したがって、私はに変更することをお勧めしKeyBindingsます(しかし、あなたはそれらについて聞いたことがあると思います)。次のように使用します。

final JButton b=..;

//method to add keybindings to a JComponent ie JButton,JPanel,JTextField etc
private void addKeyBindings(JComponent jc) {

    //not the getInputMap(..) call it could also be JComponent.WHEN_FOCUSED etc
    jc.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("D"), "D pressed");

    jc.getActionMap().put("D pressed", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            //do something when d is pressed
            b.doClick();
        }
    });
}

一般的な知識として、非常にハッキーな解決策はrequestFocusInWindow()、フォーカスが失われるたびに(ボタンをクリックした後など)リスナーが接続されているコンポーネントを呼び出すことです。

于 2012-12-09T21:35:37.040 に答える
1

これは別のハッキーなアプローチですが、JButtonを作成するときに、JButtonのプロパティを変更して、そもそもフォーカスを取得できないようにすることができます。

myJbutton.setFocusable(false);

これは私のために働いた。

于 2013-07-03T11:30:44.060 に答える