キー リスナーの代替としてキー バインドを利用する方法
KeyListeners に依存する代わりに、画面上のオブジェクトがユーザー キーに応答できるようにする入力の場合は、応答性を高めるためにキー バインディングを活用することを検討してください。
キー バインディングが提供するものKeyListeners と比較したいくつかの利点:
フォーカスの必要性の排除:
KeyListeners とは異なり、キー バインドによりオブジェクトはフォーカスの有無に関係なく入力に応答できます。これにより、ユーザーがその機能をトリガーするためにオブジェクトをクリックする必要があるという予期せぬ動作が排除されます。
容易なメンテナンスと柔軟性:
キー バインディングにより、ユーザー入力アクションの管理とカスタマイズが簡素化されます。キーへの新しいアクションの再バインド、無効化、割り当てが簡単になり、コードの可読性と保守性が向上します。
キー バインドの機能:
キー バインドは、InputMap と ActionMap の 2 つのコンポーネントで構成されます。 。 InputMap は、ユーザー入力 (キーの押下など) をアクション名に関連付けます。次に、ActionMap はアクション名を特定のアクションにリンクします。ユーザーがキーを押すと、InputMap は対応するアクション名を識別し、ActionMap は関連するアクションを実行します。
キー バインドの実装:
キー バインドを実装するには、ユーザー入力をマップします。次の構文を使用してアクションに追加します:
myComponent.getInputMap().put("userInput", "myAction"); myComponent.getActionMap().put("myAction", action);
例コード:
これは、キー バインディングを利用した、元の質問で提供されたコードの改訂版です:
import javax.swing.*; import java.awt.event.*; public class MyGame extends JFrame { private static final int IFW = JComponent.WHEN_IN_FOCUSED_WINDOW; 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() { // ... GUI layout and management ... obj1.getInputMap(IFW).put(KeyStroke.getKeyStroke("UP"), MOVE_UP); obj1.getInputMap(IFW).put(KeyStroke.getKeyStroke("DOWN"), MOVE_DOWN); obj1.getInputMap(IFW).put(KeyStroke.getKeyStroke("control CONTROL"), FIRE); obj2.getInputMap(IFW).put(KeyStroke.getKeyStroke("W"), MOVE_UP); obj2.getInputMap(IFW).put(KeyStroke.getKeyStroke("S"), MOVE_DOWN); obj2.getInputMap(IFW).put(KeyStroke.getKeyStroke("T"), 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.getActionMap().put(MOVE_UP, new MoveAction(1, 2)); obj2.getActionMap().put(MOVE_DOWN, new MoveAction(2, 2)); obj2.getActionMap().put(FIRE, new FireAction(2)); // ... Remaining GUI setup ... } static void rebindKey(KeyEvent ke, String oldKey) { // ... Handle key rebinding ... } public static void main(String[] args) { new MyGame(); } private class MoveAction extends AbstractAction { // ... Action details ... } private class FireAction extends AbstractAction { // ... Action details ... } }
InputMap を ActionMap から分離することで、コードの再利用性が向上し、より詳細な制御が可能になります。キーバインドについて。さらに、アクションを個別に有効または無効にできるため、柔軟性が高まります。
特定の要件やプロジェクトの目標に基づいて、自由にコードをさらに改良してください。
以上がアプリケーションの応答性を高めるためにキー リスナーの代わりにキー バインディングを使用する理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。