web-dev-qa-db-fra.com

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");
44
java baba

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 vous sera utile!

79
Brendan

Vous pouvez utiliser le focusedProperty de Node pour attacher un ChangeListener.

Étendre la réponse de Brendan: de JavaFX8 (car il est fourni avec Java 8), une expression lambda combinée à un opérateur ternaire peut la rendre vraiment compacte:

textField.focusedProperty().addListener((obs, oldVal, newVal) -> 
    System.out.println(newVal ? "Focused" : "Unfocused"));
9
DVarga

Vous souhaiterez attacher un ChangeListener à la FocusProperty du TextField que vous souhaitez surveiller.

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

Reportez-vous à ce message si vos gestionnaires d'événements feront d'autres choses telles que la modification des paramètres des boutons Annuler ou Par défaut: JavaFX 2 - Définition de la propriété defaultButton: mutuellement exclusifs?

Voici un code pour attacher un écouteur 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é avec addListener () et removeListener (). Pour un TextField de courte durée, vous pouvez spécifier l'objet écouteur avec une classe interne anonyme.

Voici la classe privée que j'ai écrite pour mon auditeur de focus:

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
scottb