Button-Keyboard Interaktion

jono

Top Contributor
Hallo,

Wie schaffe ich es mithilfe des SceneBuilders einen Button mit einer gewissen Taste zu verbinden? Habe On Key Pressed im SceneBuilder dafür verwendet, worin ich dann die unten geschriebene Methode aufrufe.
Im Code selbst habe ich dann eine Methode, worüber steht @FXML, geschrieben in der Folgendes steht:
Java:
@FXML
void keyPressed(KeyEvent event) {

        if (event.getCode() == KeyCode.KP_LEFT) {

            press.fire();  //press ist ein Button, der über FXML angelegt ist
        }

So funktioniert es aber noch nicht, der Button wird in meinem Fenster noch nicht ausgeführt...
 
Im Augenblick verstehe ich den Aufbau noch nicht wirklich.

Du hast einen Button. Wenn der Button angeklickt wird, dann wird im Controller eine Methode ausgeführt.
Nun hörst Du noch auf Tastatur Events. Wenn da dann auch die Methode des Buttons aufgerufen werden soll, dann kannst Du doch direkt die Methode im Controller aufrufen. Du musst also gar nichts mit dem Button machen.

Das ist doch auch eigentlich die Idee der Trennung: Der Controller sollte eigentlich gar nicht wissen, was es für Controls gibt. Der Controller stellt für die View das Model bereit und hält Methoden zur Verfügung, die die View ansprechen kann. Ob da nun ein Button, ein Image, ein Link oder sonst irgendwas in der View benutzt wird, interessiert den Controller daher nicht. Das hat den Vorteil, dass man die View frei ändern kann ohne den Controller ständig anpassen zu müssen. Und der Controller kann deutlich besser getestet werden.

Aber davon unabhängig:
Ein Problem, dass aber auch noch sein kann: Das mit dem On Key Pressed würde in dem Control ausgeführt, das den Fokus hat. Das auf dem Button zu packen bringt nichts, wenn der Button nicht den Fokus hat. Daher muss sicher sein, dass das Control, das den Fokus hat, diesen Key Listener nutzt. Also z.B. direkt auf der Scene kannst Du den setzen.
 
Das sind die Hotkeys, die da beschrieben wurden, aber die sind nur begrenzt möglich. Eine Pfeiltaste lässt sich da meines Wissens nicht belegen, oder? Oder liegt das jetzt schlicht daran, dass ich das nur noch nie ausprobiert habe und halt diese Methodik nur in "Business" Anwendungen genutzt habe und die andere Variante mit Key Listener in Spielen?
 
Du musst also gar nichts mit dem Button machen.
Wie ist das gemeint? Ich will mit der Tastatur Buttons bedienen können... Habe einen Controller, in dem Methoden ausgeführt werden, wenn ein jeweiliger Button betätigt wird durch einen Mausklick. Nun will ich diese Buttons entsprechend durch sinnvolle Tasten ausführen.
Das mit dem On Key Pressed würde in dem Control ausgeführt, das den Fokus hat
Was ist hier genau mit dem Fokus gemeint?
 
Du willst, dass dann der Code ausgeführt wird, der im Controller für den Button hinterlegt ist. Da muss aber nicht der Button explizit gedrückt werden.

Du hast eine Klasse (hier den Controller). Du willst jetzt an einer Stelle dieser Klasse eine andere Methode der Klasse aufrufen. Dann machst Du das doch direkt. Du rufst nicht irgend etwas anderes auf damit diese andere Klasse / Instanz dann die gewünschte Methode aufruft.

Und die nächste wichtige Frage ist, was Du da für eine Bedienung haben willst. Es gibt eine Mechanik für Hotkeys. Diese sind relativ einfach hinzuzufügen ohne extra Keyboard Listener. Dabei bist Du aber auf die typischen Hotkeys beschränkt. In dem Beispiel hattest Du aber einfach den Linkspfeil des Zehnerblocks. Der link von @mihe7 würde die typischen Tasten-Kombinationen für Buttons abdecken.

Und Fokus meint, dass ein Control eine Eingabe bekommt. Wenn Du also z.B. eine Eingabemaske hast, dann hat ein Control den Fokus und Tastendrücke gehen an dieses Control. Und wenn Du einen KeyListener auf einem speziellen Control hast, dann bekommt dieses ggf. die Tastendrücke nicht mit, weil die halt woanders hin gehen ...
 
Gerade getestet:
Java:
        KeyCombination kc = new KeyCodeCombination(KeyCode.LEFT);
        scene.getAccelerators().put(kc, () -> System.out.println("Yep"));
funktioniert. Allerdings würde ich eine Pfeiltaste auch nicht als Hotkey betrachten...
 

Zurück
Oben