Bonjour,
Je rencontre quelques difficultés dans la mise en place d'une liste d’éléments avec un affichage sous forme de CheckBoxListCell.
En m'inspirant de l'excellent tutoriel de Mr Bouyé sur L'API Cell de javaFX (c'est pas juste pour espérer une réponse, je le pense sincèrement, ), j'ai utilisé une ObservableMap pour lier les choix fais par l’utilisateur aux éléments contenus dans une liste.
Pour une meilleure compréhension j'ai mis le code utilisé pour réaliser les tests à la fin de mon message.
Les éléments affichés dans la ListView sont de type Compose, et sont stockés initialement dans une liste observable 'nodeList'. Chaque élément de cette liste est ajouté à la liste ObservableMap 'itemBooleanMap' qui est utilisée pour la ListView.
J'ai deux questions :
- Dans la listView, j'affiche une propriété de la classe Compose (le nom de mon composé). Lorsque je mets à jour cette propriété dans un élément de la liste de Compose 'nodeList', cette modification n'est pas propagée à l'ObservableMap. Il ne semble pas y avoir de méthode pour apporter des modifications à une clé.
Je ne sais pas quelle méthode est la meilleur répercuter la modification de la propriété du Composé à la clé contenue dans l'ObservableMap. J'ai bien pensé à supprimer cette clé et à en créer une nouvelle mais je trouve ça un peu brutal. D'autant plus que je souhaite conserver la propriété de sélection qui implique d'autres modifications dans la version complète de mon code.
Auriez-vous des pistes pour cela ?- Lorsque les éléments sont ajoutés à la liste ObservableMap, l'ordre des éléments n'est pas forcément celui de la liste de départ. Auriez-vous une explication, et éventuellement une technique pour conserver cet ordre.
Merci d'avance.
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 public class testListView extends Application{ private ObservableList <Compose> nodeList = FXCollections.observableArrayList(); private final ObservableMap<Compose, BooleanProperty> itemBooleanMap = FXCollections.observableHashMap(); ListView<Compose> listView = new ListView<Compose>(); @Override public void start(Stage primaryStage) throws Exception { // Permet de récupérer la propriété JavaFX associée à chaque clé. final Callback<Compose, ObservableValue<Boolean>> propertyAccessor = (Compose key) -> itemBooleanMap.get(key); // Permet d'afficher un label qui porte le nom du réacteur dans chaque cellule de la liste. final StringConverter<Compose> labelConverter = new StringConverter<Compose>() { @Override public String toString(Compose t) { return t.getNomCompose().get(); } // On n'utilise pas cette méthode. @Override public Compose fromString(String string) { throw new UnsupportedOperationException("Not supported yet."); } }; listView.setCellFactory(CheckBoxListCell.forListView(propertyAccessor, labelConverter)); nodeList.addListener((javafx.collections.ListChangeListener.Change<? extends Compose> c) -> { while (c.next()) { if (c.wasAdded()) { for (Compose p : c.getAddedSubList()) { itemBooleanMap.put(p, new SimpleBooleanProperty()); } } if (c.wasRemoved()) { for (Compose p : c.getRemoved()) { itemBooleanMap.remove(p); } } } }); nodeList.add(new Compose("Compose.1")); nodeList.add(new Compose("Compose.2")); nodeList.add(new Compose("Compose.3")); nodeList.add(new Compose("Compose.4")); listView.getItems().addAll(itemBooleanMap.keySet()); Button renameItemButton = new Button("Rename first Item"); renameItemButton.setOnAction((event) -> { nodeList.get(0).setNomCompose("test"); System.out.println("Name of the first compose : "+ nodeList.get(0).getNomCompose().get()); }); final VBox vBox = new VBox(); vBox.getChildren().add(listView); vBox.getChildren().add(renameItemButton); final Scene scene = new Scene(vBox); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } /** * Décalaration de la classe Compose utilisée pour réaliser ce test. * */ public class Compose { /************************************************************************** * * Décalaration des champs privés * **************************************************************************/ private StringProperty nomCompose = new SimpleStringProperty(); // Nom du composé /************************************************************************** * * Constructeur * **************************************************************************/ public Compose(String nom){ this.nomCompose = new SimpleStringProperty(nom); } /************************************************************************** * * Propriétés (Getters / Setters) * **************************************************************************/ public StringProperty getNomCompose() { return nomCompose; } public void setNomCompose(String nomCompose) { this.nomCompose.set(nomCompose); } public StringProperty nomComposeProperty() { return nomCompose; } } }
Partager