Bonjour,
Je suis actuellement en train de coder un lecteur audio en javaFX. J'arrive à la fin mais je me rend compte que j'ai beaucoup de mal à gérer mes raccourcis claviers.
Par exemple sur la fenêtre principale, sur laquelle il y a le lecteur lui même, j'affecte à la touche droite le fait d'avancer de 3s dans la chanson :
1 2 3 4 5 6 7 8 9 10
| SoundLooper.getInstance().getPrimaryStage().getScene().setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
...
} else if (event.getCode() == KeyCode.RIGHT) {
// RIGHT : Move in media +3s
player.moveMediaTime(3000);
event.consume();
...
} |
Ce raccourci est positionné directement sur la fenêtre pour être activé quelque soit le champ qui a le focus
Ca, ça fonctionne bien.
Maintenant, j'ai également sur cette fenêtre un champ spinner qui permet de noter le volume entre 0 et 100. J'ai rajouté un filter dessus pour n'accepter que les numériques :
1 2 3 4 5 6 7 8
| spinnerVolume.addEventFilter(KeyEvent.KEY_TYPED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (!event.getCharacter().matches("[1-9]")) {
event.consume();
}
}
}); |
Je pensais qu'en faisant ça, les touches gauche et droite ne fonctionneraient même plus dans le spinner, mais si, elles fonctionnent encore, et un appui sur la touche droite a alors 2 actions :
- Déplace le curseur dans le spinner
- Avance de 3 seconde dans la chanson
Je voudrai faire en sorte que la touche droite avance de 3 secondes dans la chanson quelque soit le champ qui a le focus, sauf si c'est un champ qui utilise déjà cette touche (comme un champ texte, par exemple), comment arriver à ça ?
Autre exemple, toutes les popups de l'appli doivent se fermer avec la touche echap, j'ai une popup qui contient juste une combo box éditable, et un bouton valider.
Sur le même principe, à l'initialisation du contrôleur, je fait :
1 2 3 4 5 6 7 8 9 10
| stage.getScene().setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent e) {
if (e.getCode() == KeyCode.ENTER) {
validate();
} else if (e.getCode() == KeyCode.ESCAPE) {
cancel();
}
}
}); |
Si le Textfield du combo box a le focus, un appui sur echap ne fait rien (je ne rentre pas dans la méthode "handle"). Par contre si j'appui sur tab pour quitter le textfield, et que je rappui sur échap, la popup se ferme bien.
Par contre, si je remplace
else if (e.getCode() == KeyCode.ESCAPE)
Par
else if (e.getCode() == KeyCode.RIGHT)
La popup se ferme bien quand j'appuie sur la touche de droite, que je sois dans le textfield ou pas...
Je pense donc que je passe à côté de quelque chose, et j'ai peur de devoir monter une usine à gaz pour me rapprocher du comportement que je veux au final.
Quelqu'un saurait me dire ce que je fais de travers ??
Merci d'avance,
Partager