Accueil / Articles PiApplications. / La plate-forme Java / Java FX

Capturer la perte de focus d'un contrôle d'édition (TextInputControl).

Les contrôles d'édition sont les contrôles qui héritent de la classe TextInputControl. Cet classe ne produit pas d'évènement lorsque le contrôle perd le focus. Dans le fonctionnement "standard", la saisie doit être validée via l'action sur la touche ENTREE qui, elle, déclenche l'évènement onAction.

Cette action sur la touche ENTREE imposée à l'utilisateur n'est pas forcément intuitive et exige de la part de ce dernier une action supplémentaire. Dans de nombreux cas, on est pas obligé d'exiger cela. A la place, on traite la saisie lorsque le contrôle perd le focus. Cette perte de focus jour alors le rôle d'une validation implicite et dote le contrôle d'un comportement plus "naturel" dans la plupart des cas.

Pour y parvenir, le principe et d'ajouter au contrôle d'édition un pseudo-gestionnaire automatiquement invoqué lors de la perte du focus. Pour ce faire, il faut ajouter à la propriété qui gère le focus du contrôle (focusedProperty) une classe qui implémente l'interface ChangeListener.

_tbxCntDisplayName.focusedProperty().addListener(new DisplayNameListener(this));

Dans cet exemple, _tbxCntDisplayName est un attribut de classe TextField. La classe ajoutée est DisplayNameListener à laquelle nous passons en paramètre le "contrôleur" de la fenêtre qui héberge le contrôle. Voici le squelette de cette classe :

public class DisplayNameListener implements ChangeListener<Boolean>
{
  /**
   * Contrôle auquel est associé ce gestionnaire de changement d'état du focus.
   */
  private final TextInputControl _tic;

  /**
   * Contôleur de la classe qui héberge le contrôle
   */
  private final FXMLMainController _fmc;

  /**
   * Constructeur.
   * @param fmc Contrôleur de la fenêtre principale de l'application.
   */
  public DisplayNameListener(FXMLMainController fmc)
  {
    if (fmc == null)
      throw new NullPointerException();
    _fmc = fmc;
    // C'est le contrôleur qui permet de réfrencer le contrôle d'édition
    _tic = _fmc.getDisplayNameTextField();
  }

  /**
   * Invoqué lorsque l'état du focus de ce contrôle change.
   * @param obs Valeur qui a été modifiée.
   * @param blnOldValue Ancienne état du focus.
   * @param blnNewValue Nouvel état du focus (prise = false).
   */
  @Override
  public void changed(ObservableValue<? extends Boolean> obs, Boolean blnOldValue, Boolean blnNewValue)
  {
    // Indicateur d'état de la prise de focus
    if (blnNewValue)
      return;
    // Si on poursuit c'est que le focus a été perdu
    ...
  }
}

Vous êtes libre de traiter la saisie comme vous l'entendez en lieu et place des points de suspension. Vous pouvez également modifier les paramètres du constructeur, il ne s'agit ici que d'un exemple. N'oubliez pas que si le code de cette classe s'exécute sur un thread différente de celui qui a créé le contrôle, vous devrez prendre certaines précautions avant d'accéder aux méthodes du contrôle.

(c) PiApplications 2016