ホームページ > Java > &#&チュートリアル > Swing アプリケーションでキー リスナーの代わりにキー バインディングを使用する理由

Swing アプリケーションでキー リスナーの代わりにキー バインディングを使用する理由

Mary-Kate Olsen
リリース: 2024-12-17 00:50:25
オリジナル
320 人が閲覧しました

Why Use Key Bindings Instead of Key Listeners in Swing Applications?

キー リスナーの代わりにキー バインドを利用する方法

キー バインドを検討する理由

キー バインディングには、キー リスナーよりも優れた利点があります。以下を含みます:

  • 入力のためにコンポーネントをクリックする必要はありません: これにより、ユーザーの混乱を招く動作がなくなり、複数のオブジェクトが同時に入力を受信できるようになります。
  • 簡単になりますメンテナンスと操作: バインディングにより、ユーザーの無効化、再バインド、再割り当てが簡素化されます。

キー バインディングの実装

キー バインディングには、InputMap と ActionMap の 2 つのオブジェクトが関係します。 InputMap はユーザー入力をアクション名に関連付けますが、ActionMap はアクション名をアクションにマップします。キーが押されると、InputMap はアクション名を取得し、ActionMap は対応するアクションを実行します。

このプロセスは次のコードで示されています。

myComponent.getInputMap().put("userInput", "myAction");
myComponent.getActionMap().put("myAction", action);
ログイン後にコピー

WHEN_IN_FOCUSED_WINDOW の使用

指定された例では、InputMap は次を使用します。 WHEN_IN_FOCUSED_WINDOW: フォーカスされたウィンドウ内のコンポーネントの入力を許可します。これは、複数のオブジェクトが入力を同時に受信する必要があるシナリオに適しています。

キー バインディングの例

質問コードで提供されている例は、キー バインディングを使用するように変更できます。以下に示すように:

import javax.swing.*;

public class MyGame extends JFrame {

    private static final String MOVE_UP = "move up";
    private static final String MOVE_DOWN = "move down";
    private static final String FIRE = "move fire";

    static JLabel obj1 = new JLabel();
    static JLabel obj2 = new JLabel();

    public MyGame() {

        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("UP"), MOVE_UP);
        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("DOWN"), MOVE_DOWN);
        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("control CONTROL"), FIRE);

        obj1.getActionMap().put(MOVE_UP, new MoveAction(1, 1));
        obj1.getActionMap().put(MOVE_DOWN, new MoveAction(2, 1));
        obj1.getActionMap().put(FIRE, new FireAction(1));

        obj2.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("W"), MOVE_UP);
        obj2.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("S"), MOVE_DOWN);
        obj2.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("T"), FIRE);

        obj2.getActionMap().put(MOVE_UP, new MoveAction(1, 2));
        obj2.getActionMap().put(MOVE_DOWN, new MoveAction(2, 2));
        obj2.getActionMap().put(FIRE, new FireAction(2));

        add(obj1);
        add(obj2);
    }

    static void rebindKey(KeyEvent ke, String oldKey) {

        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .remove(KeyStroke.getKeyStroke(oldKey));
        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStrokeForEvent(ke),
                        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                                .get(KeyStroke.getKeyStroke(oldKey)));
    }

    public static void main(String[] args) {

        new MyGame();
    }

    private class MoveAction extends AbstractAction {

        int direction;
        int player;

        MoveAction(int direction, int player) {

            this.direction = direction;
            this.player = player;
        }

        @Override
        public void actionPerformed(ActionEvent e) {

            // Implement move action for the player.
        }
    }

    private class FireAction extends AbstractAction {

        int player;

        FireAction(int player) {

            this.player = player;
        }

        @Override
        public void actionPerformed(ActionEvent e) {

            // Implement fire action for the player.
        }
    }
}
ログイン後にコピー

追加機能

キー バインドにより追加機能が提供されます:

  • キーの再バインド: アクションに関連付けられたキーを簡単に置き換えます。
  • アクションを無効にする: 特定のアクションを一時的に禁止します。
  • アクションを直接制御: アクションに直接アクセスして、さらに制御します。

以上がSwing アプリケーションでキー リスナーの代わりにキー バインディングを使用する理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート