Java Swing のキー バインディングとキー リスナー: 総合ガイド
キー バインディングとキー リスナーは、ユーザー入力イベントを処理する 2 つのアプローチですJava Swing アプリケーションのキーから。キー リスナーはキーの押下を検出する簡単な方法を提供しますが、キー バインディングには次のようないくつかの利点があります。
キー バインディングについて
キーバインディングには 2 つの要素が含まれますオブジェクト:
キーが押されると、入力マップはキーを検索し、アクション名を検索します。次に、アクション マップでアクション名が検索され、アクションが実行されます。
キー バインドの実装
単一のキー バインドを作成するには、次の構造を使用します。
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 サイトの他の関連記事を参照してください。