キー リスナーの代わりにキー バインドを利用する方法
キー バインドを検討する理由
キー バインディングには、キー リスナーよりも優れた利点があります。以下を含みます:
キー バインディングの実装
キー バインディングには、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 サイトの他の関連記事を参照してください。