Bonjour,
J'ai un fonctionnement pour le moins curieux dans mon code ...
J'ai un ListView qui est défini comme suit:
ListElement est un classe personnelle et nous retiendrons seulement pour l'exemple qu'elle contient:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 @FXML private ListView<ListElement> lvObj;
Dans mon "Initialize", je mets une observableCollection "myActiveListEL" comme source de mon ListView lvObj:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public Boolean getSiPolePosition() { return siPolePosition.get(); } public void setSiPolePosition(Boolean SiPolePosition) { this. siPolePosition.set( SiPolePosition); } public BooleanProperty siPolePositionProperty() { return siPolePosition; }
à ce moment, mon listView affiche correctement chaque cellule de mon ListView.
Code : Sélectionner tout - Visualiser dans une fenêtre à part lvObj.setItems(myActiveListEL);
Je construit chaque cellule de mon ListView avec :
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 lvObj.setCellFactory(new Callback<ListView<ListElement>, ListCell<ListElement>>() { @Override public ListCell<ListElement> call(ListView<ListElement> arg0) { return new ListCell<ListElement>() { @Override protected void updateItem(ListElement item, boolean bln) { super.updateItem(item, bln); if (item != null) { VBox vBox = new VBox(); if(item.getSiPremierTitre1()|| item.getSiPolePosition()) { HBox hBox = new HBox(); hBox.getChildren().addAll(new Label("Titre 1 "), new Text(item.getTitre1())); vBox.getChildren().addAll(hBox); } if(item.getSiPremierTitre2()|| item.getSiPolePosition()) { HBox hBox = new HBox(); hBox.getChildren().addAll(new Label(" Titre 2 "), new Text(item.getTitre2())); vBox.getChildren().addAll(hBox); } HBox hBox = new HBox(); hBox.getChildren().addAll(new Label(" Ma valeur = "), new Text(item.getValeur())); vBox.getChildren().addAll(hBox); setGraphic(vBox); } } }; } });
Pas la peine d'analyser ce setCellFactory, il fonctionne correctement...
Sur un bouton "handleButton", j'efface l'élément (0) de mon ObservableCollection
et sur le nouvel élément qui se trouve ensuite en première position, je change le boolean pour indiquer que cet élément se trouve en première position (siPolePosition = true)
Si j'exécute ce code, le fait d'avoir changer le "setSiPolePosition" à true va faire que mon lvObj.setCellFactory décrit plus haut va s'exécuter pour ma première cellule de la liste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 private void handleButton() { myActiveListEL.remove(0); myActiveListEL.get(0).setSiPolePosition(true); //handleButtonDown(); }
C'est le comportement attendu, tout va bien jusque là...
Vous aurez remarqué l'appel "//handleButtonDown();" qui a été mis en commentaire.
En fait cette méthode rajoute un élément (myCurrentElement) dans mon observable collection myActiveListEL:
Le fait de d'appeler ce "handleButtonDown" dans ma méthode "handleButton" fait que le setCellFactory n'est plus appelé pour le premier élément de mon listView.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 @FXML private void handleButtonDown() { myActiveListEL.add(myCurrentElement); }
Si je clique sur bouton1 "handleButton" et puis sur "handleButtonDown", je passe dans le setCellFactory et tout est OK. Mais si j'inclus le code de "handleButtonDown" directement dans "handleButton", la mise à jour ne se fait pas !
Plutôt curieux, non ?
Existe-t'il un moyen de forcer le passage dans le setCellFactory après l'instruction:
qui se trouve dans mon HandleButton ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part myActiveListEL.get(0).setSiPolePosition(true);
Partager