Keller-Dev Docs · Java & Hytale

Java Core

Input-Handling: Swing Key Bindings vs. KeyListener

Ein klassischer KeyListener verliert die Tasteneingaben, sobald das Panel den Fokus verliert. Key Bindings über JComponent.WHEN_IN_FOCUSED_WINDOW reagieren verlässlich, solange das Fenster fokussiert ist. Thread-Sicherheit: Da Key Bindings auf dem EDT laufen, der Game-Loop-Thread die Eingaben aber ausliest, muss ein thread-sicheres Set verwendet werden: ConcurrentHashMap.newKeySet() statt eines normalen HashSet.

Referenz: Datei 1. Spielprojekt · Klasse InputHandler
// Thread-sichere Tastenerfassung
private final Set<Integer> pressedKeys = ConcurrentHashMap.newKeySet();

public void registerKey(JComponent component, int keyCode, String name) {
    InputMap inputMap = component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap actionMap = component.getActionMap();

    inputMap.put(KeyStroke.getKeyStroke(keyCode, 0, false), name + "_pressed");
    inputMap.put(KeyStroke.getKeyStroke(keyCode, 0, true), name + "_released");

    actionMap.put(name + "_pressed", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) { pressedKeys.add(keyCode); }
    });
    actionMap.put(name + "_released", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) { pressedKeys.remove(keyCode); }
    });
}
#swing #input #keybindings #concurrency #concurrent-hashmap
Bearbeiten