web-dev-qa-db-fra.com

JavaFX: focalisation du champ de texte par programme

J'ai écrit une application avec JavaFX qui ne sera utilisable qu'avec les flèches du clavier. J'ai donc empêché MouseEvent sur scène, et j'écoute KeyEvents. J'ai également désactivé la focalisation de tous les nœuds:

for(Node n : children) {
     n.setFocusTraversable(false);

J'ai maintenant des champs de texte, des cases à cocher et des boutons. Je voudrais changer l'état de mes contrôles de saisie (champ de texte, case à cocher, ..) par programmation: par exemple, je voudrais entrer le champ de texte pour éditer le contenu par programmation. Donc ma question est: comment entrer dans un champ de texte non focus-traversable? Parce que textfield.requestFocus (); ne fonctionne plus depuis que j'ai défini false sur la propriété focustraversable de mon champ de texte.

Merci

16
PacDroid

Par

n.setFocusTraversable(false);

le nœud est rendu non focalisable au lieu de non focalisable. Il peut toujours être focalisé par exemple par la souris ou par programme. Puisque vous avez empêché les événements de souris, voici l'autre option:

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        textfield.requestFocus();
    }
});

Scene scene = new Scene(root);

MODIFIER: selon le commentaire,
Le javadoc de requestFocus indique:

... Pour pouvoir recevoir le focus, le nœud doit faire partie d'une scène, elle et tous ses ancêtres doivent être visibles, et elle ne doit pas être désactivée. ...

Cette méthode doit donc être appelée après la construction du graphe de la scène comme suit:

Scene scene = new Scene(root);
textfield.requestFocus();

Cependant, Platform.runLater dans ce qui précède s'exécutera à la fin, après la méthode principale start(), qui garantit que l'appel de requestFocus se fera après la cosntruction du graphe de scène.

Il peut y avoir d'autres raisons en fonction du code d'implémentation requestFocus.

49
Uluk Biy

définissez le .requestFocus (); sur la méthode d'initialisation pour se déclencher sur le contrôleur de chargement de fichiers .fxml

@Override
public void initialize(URL url, ResourceBundle rb) {
/* the field defined on .fxml document  
@FXML
private TextField txtYear;
*/
txtYear.requestFocus();
}
3
Ravinath