So nutzen Sie Tastenkombinationen anstelle von Tastenlistenern
Warum Tastenkombinationen in Betracht ziehen?
Tastenbindungen bieten gegenüber Tastenzuhörern Vorteile, darunter:
Implementierungsschlüssel Bindungen
Tastenbindungen umfassen zwei Objekte: InputMap und ActionMap. Eine InputMap verknüpft Benutzereingaben mit einem Aktionsnamen, während eine ActionMap Aktionsnamen Aktionen zuordnet. Wenn eine Taste gedrückt wird, ruft die InputMap den Aktionsnamen ab und die ActionMap führt die entsprechende Aktion aus.
Dieser Vorgang wird im folgenden Code veranschaulicht:
myComponent.getInputMap().put("userInput", "myAction"); myComponent.getActionMap().put("myAction", action);
Verwendung von WHEN_IN_FOCUSED_WINDOW
Im gegebenen Beispiel verwendet die InputMap WHEN_IN_FOCUSED_WINDOW, das die Eingabe für Komponenten innerhalb eines fokussierten Fensters ermöglicht. Dies eignet sich für Szenarien, in denen mehrere Objekte gleichzeitig Eingaben empfangen müssen.
Beispiel für eine Tastenzuordnung
Das bereitgestellte Beispiel im Fragecode kann geändert werden, um Tastenzuordnungen zu verwenden. wie unten gezeigt:
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. } } }
Zusätzliche Funktionen
Tastenkombinationen bieten zusätzliche Funktionen Funktionen:
Das obige ist der detaillierte Inhalt vonWarum in Swing-Anwendungen Tastenbelegungen anstelle von Tastenlistenern verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!