ホームページ > Java > &#&チュートリアル > Java Swing キーの処理: キー バインディングとキー リスナー - どちらを選択するべきですか?

Java Swing キーの処理: キー バインディングとキー リスナー - どちらを選択するべきですか?

Susan Sarandon
リリース: 2024-12-17 04:13:25
オリジナル
893 人が閲覧しました

Java Swing Key Handling: Key Bindings or Key Listeners – Which Should You Choose?

Java Swing のキー バインディングとキー リスナー: 総合ガイド

キー バインディングとキー リスナーは、ユーザー入力イベントを処理する 2 つのアプローチですJava Swing アプリケーションのキーから。キー リスナーはキーの押下を検出する簡単な方法を提供しますが、キー バインディングには次のようないくつかの利点があります。

  • 応答性の向上: キー バインディングでは、ユーザーがオブジェクトをクリックする必要がありません。集中力を高め、より高速かつ直感的な入力処理を可能にします。
  • 強化保守性: キー バインディングにより、ユーザー アクションの無効化、再バインド、再割り当てが容易になり、メンテナンスとコードの可読性が簡素化されます。

キー バインディングについて

キーバインディングには 2 つの要素が含まれますオブジェクト:

  • InputMap: ユーザー入力をアクション名にマップします。
  • ActionMap: アクション名をアクションにマップします。

キーが押されると、入力マップはキーを検索し、アクション名を検索します。次に、アクション マップでアクション名が検索され、アクションが実行されます。

キー バインドの実装

単一のキー バインドを作成するには、次の構造を使用します。

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

WHEN_IN_FOCUSED_WINDOW の使用InputMap

WHEN_IN_FOCUSED_WINDOW の InputMap を使用すると、フォーカスされたウィンドウ内の複数のコンポーネントが同時に入力を受信できるようになります。たとえば、フォーカスされたウィンドウに複数のタンクがあり、それらに入力を受信させたい場合は、次の構造を使用します。

tank1.getInputMap(IFW).put(KeyStroke.getKeyStroke("W"), "move up");
tank2.getInputMap(IFW).put(KeyStroke.getKeyStroke("S"), "move down");
// ...
tankN.getInputMap(IFW).put(KeyStroke.getKeyStroke("T"), "fire");
ログイン後にコピー

キーの再バインド

キーを再バインドするにはKeyListener を使用したキー:

obj1.getInputMap(IFW).remove(KeyStroke.getKeyStroke(oldKey));
// ...
obj1.getInputMap(IFW).put(KeyStroke.getKeyStrokeForEvent(ke),
                 obj1.getInputMap(IFW).get(KeyStroke.getKeyStroke(oldKey)));
ログイン後にコピー

コード例

キー バインディングを示すコード例を次に示します。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MyGame extends JFrame {

    public MyGame() {
        // Do layout management, create objects, etc.
        JLabel obj1 = new JLabel();
        JLabel obj2 = new JLabel();

        // Set key bindings for object 1
        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));

        // Set key bindings for object 2
        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 objects to the JFrame
        add(obj1);
        add(obj2);
    }

    // Handle key rebinding
    public static void rebindKey(KeyEvent ke, String oldKey) {
        // Find and replace key binding
    }

    // Main method
    public static void main(String[] args) {
        new MyGame();
    }

    // Inner class for move action
    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 logic
        }
    }

    // Inner class for fire action
    private class FireAction extends AbstractAction {

        int player;

        FireAction(int player) {
            this.player = player;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // Implement fire logic
        }
    }
}
ログイン後にコピー

結論

キー バインディングは、強力かつ柔軟な方法を提供します。 Java Swing アプリケーションでのユーザー入力イベントを処理します。キー バインディングを活用することで、開発者はアプリケーションの応答性、保守性、再利用性を向上させることができます。

以上がJava Swing キーの処理: キー バインディングとキー リスナー - どちらを選択するべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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