Bonjour,
J'aimerais savoir s'il existe une sorte de norme concernant le traitement des actions opérées par l'utilisateur sur son IHM qui doivent adapter d'autres parties de l'IHM. Sans faire attention, il peut se trouver un effet de boucle infinie quand on met un jour un composant qui doit changer l'état d'un autre composant. Cet autre composant avec son changement d'état doit mettre à jour le 1er composant, etc. Prenons un cas concret.
Mettons que je dispose d'une IHM contenant deux JList, ayant chacune des données dans leur modèle. On ajoute à ces deux listes un même ListSelectionListener, qu'on va appeler Ctrl.
Admettons que je veuille une seule sélection parmi les deux listes (si je sélectionne un élément de la liste1, je veux enlever la selection des élements de la liste2, et inversement).
Sans réflexion particulière, dans la méthode valueChanged de Ctrl, je regarde d'ou vient l'événement et je dis à l'autre liste de faire un clearSelection(). Le clearSelection rappelle la méthode valueChanged de la deuxième liste, et pourrait forme une boucle infinie sans tests supplémentaires.
Il est clair qu'on peut facilement ajouter une bricole dans le test effectué dans valueChanged, mais je me pose la question si la technique employée est "sun-certified".
On peut se trouver sur des cas plus complexes. Une autre méthode que j'ai employée, peut-être pas propre : dans un bloc synchronisé sur la liste2, je regarde si mon Ctrl figure dans les Listeners, je le supprime, je fais mon clearSelection, et je remets le Ctrl dans les Listener si nécessaire.
(Très) schématiquement :
En fait, le problème c'est quand on ajoute des Listeners aux composants dans l'idée de capter les interactions utilisateurs, cela peut poser problème dans les traitements-système, et appliquer de updates non désirés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 synchronized(liste2) { boolean addListener <-- (liste2.listeListeners CONTIENT Ctrl); liste2.clearSelection(); SI (addListener) ALORS liste2.addSelectionListener(Ctrl); }
Avez-vous des astuces, ou des "standards" à ce sujet ?
Merci beaucoup.
Partager