Heim > Java > javaLernprogramm > Warum in Swing-Anwendungen Tastenbelegungen anstelle von Tastenlistenern verwenden?

Warum in Swing-Anwendungen Tastenbelegungen anstelle von Tastenlistenern verwenden?

Mary-Kate Olsen
Freigeben: 2024-12-17 00:50:25
Original
320 Leute haben es durchsucht

Why Use Key Bindings Instead of Key Listeners in Swing Applications?

So nutzen Sie Tastenkombinationen anstelle von Tastenlistenern

Warum Tastenkombinationen in Betracht ziehen?

Tastenbindungen bieten gegenüber Tastenzuhörern Vorteile, darunter:

  • Nein Für die Eingabe müssen Komponenten angeklickt werden: Dies beseitigt verwirrendes Verhalten für Benutzer und ermöglicht, dass mehrere Objekte gleichzeitig Eingaben empfangen.
  • Einfachere Wartung und Manipulation: Bindungen vereinfachen das Deaktivieren, erneute Binden und Neuzuweisen Benutzeraktionen.

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);
Nach dem Login kopieren

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.
        }
    }
}
Nach dem Login kopieren

Zusätzliche Funktionen

Tastenkombinationen bieten zusätzliche Funktionen Funktionen:

  • Tasten neu binden: Ersetzen Sie ganz einfach die einer Aktion zugeordnete Taste.
  • Aktionen deaktivieren: Bestimmte Aktionen vorübergehend verhindern ausgeführt.
  • Aktionen direkt steuern: Für weitere Aktionen direkt auf die Aktion zugreifen Kontrolle.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage