Bonjour,
Je rencontre un problème dans la mise en place de listeners.
J'affiche dans une listView (speciesListListView) le nom d'une liste de composés (Compose.getNomCompose()). L'ensemble des composés est contenu dans la liste mergedComposeList. Dans cette liste, il peut exister des éléments qui portent le même nom, mais qui sont associées à des réactions différentes ((String) compose.getNomReactionAssociee()). Exemple A-Reaction 1 et A-Reaction 2
Lorsque je clique sur un des éléments listés dans speciesListListView, une liste de valeurs contenue dans ((DoubleProperty) compose.getTimeField()) est affichée dans une tableView (speciesConcentrationsTableView). L'utilisateur a alors la possibilité d'apporter des modifications à cette série de données directement dans le tableau.
Voici ce que je cherche à faire : lorsque des modifications sont apportées à compose.getTimeField(), je dois vérifier si dans la liste mergedComposeList il n'y a pas des composés qui portent le même nom. Si c'est le cas, je dois propager les modifications apportées.
En procédant de la sorte, la propagation des modifications apportées à la série de données fonctionne. Les modifications apportées au composé A-Reaction 1 sont bien propagées à A-Reaction 2.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 checkNodeListListView.setListOfCompose(mergedComposeList); // Utilisation d'un listener permettant de détecter lorsque l'utilisateur clique sur l'un ou l'autre des composés contenus dans speciesListListView speciesListListView.getSelectionModel().selectedItemProperty().addListener((changed, oldCompose, newCompose) -> { checkNodeListListView.checkComposeInjectionNode(newCompose); // Mise à jour du contenu de la tableView speciesConcentrationsTableView lorsque l'utilisateur sélectionne un composé speciesConcentrationsTableView.updateConcentrationTable(newCompose); ListChangeListener<DoubleProperty> timeFieldListener = new ListChangeListener<DoubleProperty>(){ @Override public void onChanged(Change <? extends DoubleProperty> c) { while (c.next()){ System.out.println("Modif occured in TimeField of "+ newCompose.getNomCompose() + "index : "+ c.getFrom()); if (c.wasAdded()){ System.out.println("Added value"); for (Compose compItem : listOfReactiveCompose){ if (compItem.getNomCompose() == newCompose.getNomCompose() && compItem.getNomReactionAssociee() != newCompose.getNomReactionAssociee()){ //Un doublon a été détecté, la modification est propagée. for (DoubleProperty addedElement : c.getAddedSubList()){ if (compItem.getTimeField().size() == 0 | (compItem.getTimeField().size() > 0 && compItem.getTimeField().size() <= c.getFrom())){ compItem.getTimeField().add(addedElement); }else{ compItem.getTimeField().set(c.getFrom(), addedElement); } } } } }else if (c.wasRemoved()){ System.out.println("Removed value"); for (Compose compItem : listOfReactiveCompose){ if (compItem.getNomCompose() == newCompose.getNomCompose() && compItem.getNomReactionAssociee() != newCompose.getNomReactionAssociee()){ // Un doublon a été détecté, la modification est propagée. for (DoubleProperty removedElement : c.getRemoved()){ compItem.getTimeField().remove(c.getFrom()); } } } } } } }; if (oldCompose != null){ System.out.println("Listener removed from "+ oldCompose.getNomCompose() + " -> "+ oldCompose.getNomReactionAssociee()); newCompose.getTimeField().removeListener(timeFieldListener); } System.out.println("Listener added to "+ newCompose.getNomCompose() + " -> "+ newCompose.getNomReactionAssociee()); newCompose.getTimeField().addListener(timeFieldListener); });
Le problème c'est que si je viens à apporter des modifications au composé doublon (A-Reaction 2), je tombe dans une boucle infinie. Les modifications apportées à A-Reaction 2 sont propagées à A-Reaction 1, mais comme A-Reaction 1 est modifié, le programme cherche à modifier A-Reaction 2, et ainsi de suite ...
Du coup, j'avais tenté de désactiver le listener placé sur A-Reaction 1 lorsque A-Reaction 2 est sélectionné via la commande ci-dessous. Mais ça ne change pas le problème.
Auriez vous des idées pour contourner ce problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (oldCompose != null){ System.out.println("Listener removed from "+ oldCompose.getNomCompose() + " -> "+ oldCompose.getNomReactionAssociee()); newCompose.getTimeField().removeListener(timeFieldListener); }
Merci par avance.
Partager