13 39 Data Binding and Observable
Notre mécanisme actuel pour rafraîchir la ListView repose sur un setAll explicite à chaque ajout. Ce n'est pas l'approche recommandée : dans une application plus complexe, le contrôleur risque de se désynchroniser avec les données et c'est une source classique de bugs. À la place, JavaFX propose la liaison de données : le contrôle observe une ObservableList et se met à jour automatiquement quand celle-ci change.
Migrer vers ObservableList
La logique de mise à jour est en réalité gérée par le code JavaFX lui-même. Il suffit de peupler le contrôle avec une collection observable, et il réagit aux événements émis par cette collection en exécutant son gestionnaire interne. Pour profiter de ce comportement, nous adaptons d'abord la classe TodoData en remplaçant le type du champ todoItems de List<TodoItem> à ObservableList<TodoItem>. Nous mettons aussi à jour le getter pour qu'il retourne une ObservableList.
Côté Controller principal, plutôt que d'écrire todoListView.getItems().setAll(...), nous remplaçons cet appel par todoListView.setItems(TodoData.getInstance().getTodoItems()). Cela lie directement la ListView à la liste observable du Singleton. Dès lors, ajouter ou retirer un élément de cette liste se reflète instantanément dans l'interface.
Comme la ListView est désormais synchronisée automatiquement, le code de rafraîchissement explicite après processResults() devient inutile et peut être supprimé. On garde simplement controller.processResults() et l'appel à select(newItem) pour mettre en focus le nouvel élément. Au lancement, ajouter un TodoItem le fait apparaître immédiatement dans la liste, sans qu'aucun code de rafraîchissement explicite ne soit nécessaire.
En résumé
La liaison de données (data binding) permet de lier automatiquement un contrôle à des données sans avoir à écrire du code explicite pour gérer les mises à jour. En utilisant une ObservableList, le contrôle détecte automatiquement les changements de données et se met à jour sans intervention du développeur, ce qui évite les désynchronisations entre le contrôle et les données. Cette approche remplace la méthode inefficace et peu fiable de repeupler manuellement le ListView chaque fois que les données changent.
Points clés
- La liaison de données remplace la mise à jour explicite des contrôles en repeuplant manuellement
- Les ObservableList permettent au contrôle de détecter automatiquement les changements de données
- Le contrôle s'abonne aux événements levés par la collection observable via un gestionnaire automatique
- Utiliser setItems() pour lier le ListView à l'ObservableList plutôt que d'utiliser getItems().setAll()
- Une fois liées, les données s'ajoutent automatiquement à la vue sans code supplémentaire
Questions fréquentes
Pourquoi la liaison de données est-elle préférable au repeuplement manuel du ListView ?
Parce que c'est plus efficace, ça évite les désynchronisations entre le contrôleur et les données dans les applications complexes, et le contrôle se met à jour automatiquement sans code explicite.
Comment mettre en place la liaison de données en JavaFX ?
Il faut utiliser une ObservableList dans la classe de données, puis utiliser setItems() dans le contrôleur pour lier le ListView à cette liste observable.
Quel code peut-on supprimer après avoir mis en place la liaison de données ?
On peut supprimer tout le code qui repeuple explicitement le ListView quand l'utilisateur ajoute un nouvel élément, car cela est maintenant géré automatiquement par la liaison de données.