Comment effectuer une tâche sur javaFX TextField à onfocus et outfocus?

je travaille sur le projet JavaFX. J'ai besoin d'effectuer une tâche sur un JavaFX TextField .

par exemple sur l'événement "on focus" pour le TextField je veux imprimer

System.out.println("Textfield on focus");

et sur l'événement" out focus "il devrait imprimer

System.out.println("Textfield out focus");
38
demandé sur Lii 2013-05-14 21:28:31

3 réponses

j'ai pensé qu'il pourrait être utile de voir un exemple qui spécifie le ChangeListener comme une classe interne anonyme comme scottb mentionné.

TextField yourTextField = new TextField();
yourTextField.focusedProperty().addListener(new ChangeListener<Boolean>()
{
    @Override
    public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue)
    {
        if (newPropertyValue)
        {
            System.out.println("Textfield on focus");
        }
        else
        {
            System.out.println("Textfield out focus");
        }
    }
});

j'espère que cette réponse est utile!

64
répondu Brendan 2013-06-06 20:05:05

vous voudrez attacher un ChangeListener à la propriété de mise au point du champ de texte que vous souhaitez surveiller.

dans JavaFX, vous pouvez attacher des événements de notification (changement ou invalidation des écouteurs) à n'importe quelle propriété JavaFX qu'un objet peut posséder tant que la propriété répond à la définition minimale pour un haricot JavaFX.

se Référer à ce post si vos gestionnaires d'événements seront à faire d'autres choses telles que la modification de l'Annuler ou de paramètres par Défaut des boutons: JavaFX 2 -- Définir la propriété defaultButton: mutuellement exclusive?

voici un code pour attacher un auditeur de changement à une zone de texte:

txtDx.focusedProperty().addListener(m_txtDxListener);

l'objet Listener a été stocké dans un champ d'instance afin de pouvoir être utilisé à la fois avec addListener() et removeListener(). Pour un champ de texte de courte durée, vous pouvez spécifier l'objet d'écoute avec une classe interne anonyme.

Voici la classe privée que j'ai écrit pour mon interlocuteur:

private class FocusPropertyChangeListener implements ChangeListener<Boolean> {

    FocusPropertyChangeListener() { System.out.println("New FPCL instance"); }

    @Override
    public void changed(ObservableValue<? extends Boolean> ov, 
        Boolean oldb, Boolean newb) {
        System.out.println("Focus change triggered");

        if (ancEncEditor.isVisible() && !ancEncEditor.isDisabled()) {
            boolean b = (newb != null && newb.booleanValue() == true);
            System.out.println("txtDx focus change event triggered: DxAdd = " + b);

            if (b) { btnDxAdd.setDefaultButton(true); }
            else { btnWindowCommit.setDefaultButton(true); }
            btnWindowCommit.setCancelButton(true);
            btnDxAdd.setDefaultButton(b);
        }
    }
}
8
répondu scottb 2017-05-23 12:34:41

vous pouvez utiliser le focusedProperty de Node pour joindre un ChangeListener .

extension de la réponse de Brendan: de JavaFX8 (comme il est livré avec Java 8), une expression lambda combiné avec un opérateur ternaire peut le rendre vraiment compact:

textField.focusedProperty().addListener((obs, oldVal, newVal) -> 
    System.out.println(newVal ? "Focused" : "Unfocused"));
6
répondu DVarga 2017-09-26 12:26:54