Bonjour,

J'ai un fonctionnement pour le moins curieux dans mon code ...

J'ai un ListView qui est défini comme suit:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
@FXML
	private ListView<ListElement> lvObj;
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
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;
    }
Dans mon "Initialize", je mets une observableCollection "myActiveListEL" comme source de mon ListView lvObj:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
lvObj.setItems(myActiveListEL);
à ce moment, mon listView affiche correctement chaque cellule de mon ListView.

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)

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();
 
	}
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.
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
@FXML
	private void handleButtonDown() {
 
			myActiveListEL.add(myCurrentElement);		
 
	}
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.

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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
myActiveListEL.get(0).setSiPolePosition(true);
qui se trouve dans mon HandleButton ???