Nous allons considéré ici le plus simple des contrôle de saisie, l'objet de classe . Ce contrôle propose plusieurs moyen d'agir en fin de saisie de façon à la valider ou l'invalider. Le plus simple consiste à ajouter un gestionnaire à l'évènement onAction. Hélas, cela suppose que l'utilisateur frappe la touche
Les autres moyens consiste à capturer la frappe de chaque touche. Ceci peut ralentir fortement la saisie et peut ne pas être utilisable si la validation impose de connaître la totalité du texte saisi.
Ainsi, on se retrouve sans solution "clef en main" pour réaliser une opération somme toute courante.
La plate-forme JavaFX est tellement riche que de nombreuses solutions sont souvent disponibles pour traiter une même difficulté. Nous présentons ici une de ces solutions.
En fait, ce que nous souhaitons c'est que la validation de la saisie ait lieu dès que l'utilisateur quitte le contrôle, c'est à dire lorsque ce dernier perd le focus. Fort heureusement, toute classe qui hérite de la classe dispose de la propriété focused qui permet de savoir si le nœud graphique dispose ou non du focus. De plus, toute propriété peut se voir doter d'un auditeur (listener) capable de capturer son changement d'état afin d'invoquer un gestionnaire approprié. Il est donc possible d'invoquer un gestionnaire lorsque le contrôle prend ou perd le focus.
La propriété focused retourne un objet de classe ReadOnlyBooleanProperty. Cette dernière via son héritage de la classe ObservableValue dispose de la méthode addListener qui permet d'invoquer un gestionnaire lors de son changement d'état.
Le prototype de cette méthode est void addListener(ChangeListener<? super T> listener). En conséquence, notre gestionnaire doit implémenter l'interface ChangeListener.
Cette interface est une interface fonctionnelle d'unique méthode void changed(ObservableValue<? extends T> observable, T oldValue, T newValue). Il est donc possible de l'implémenter via une expression lambda (Java 8 et versions supérieure).
_monTextField.focusedProperty().addListener((observableValue, oldStatus, newStatus) ->
{
if (!newStatus) // perte du focus
{
// Le contrôle vient de perdre le focus
if (!maValidation(_monTextField.getText()))
{
_monTextField.requestFocus();
_monTextField.setStyle("-fx-text-fill: #ff0000;");
}
else
_monTextField.setStyle("-fx-text-fill: -fx-light-text-color;");
}
});Dans cet exemple, si la validation échoue, le texte s'affiche en rouge et le contrôle redemande le focus. _monTextField est un contrôle de classe TextField par exemple. maValidation() est la méthode qui constitue le corps du gestionnaire invoqué à chaque fois que _monTextField prend ou perd le focus.
Rédaction par Jean-Marie Piatte (1983-2021)