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); }
});
}