IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

inaceptable manque de contrôle sur le setCellFactory


Sujet :

JavaFX

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut inaceptable manque de contrôle sur le setCellFactory
    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 ???

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Bonjour,

    Alors que je change une propriété d'un élément de mon observable collection, le "rafraichissement" du ListView ne se fait pas.
    En fait, comme je l'ai expliqué dans le message précédent, parfois il se fait et parfois pas...

    J'ai trouvé un moyen pour que le rafraichissement se fasse à tous les coups, mais ce n'est pas très élégant...
    je fais un remove de l'élément incriminé et puis je le rajoute à nouveau.

    Mon problème est donc contourné, mais je ne marque pas le sujet comme résolu car pour moi le problème reste entier.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 875
    Points : 22 942
    Points
    22 942
    Billets dans le blog
    53
    Par défaut
    J'avoue que c'est tellement décousu et peu précis que je ne saisi pas trop bien ce que tu veux faire ou ce qui cause des soucis (et je peux encore moins créer un test).
    Y a pas moyen que tu fournisses un exemple simple auto-suffisant qui démontre le soucis ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Bonsoir,

    Je concède que c'était difficilement compréhensible.

    J'ai refait un developpez.fxml et son contrôleur DeveloppezController.java
    Notez que pour l'exemple et la simplicité, j'ai intégré ma classe "ListElements" à mon controller.

    C'est du javaFx 2.2 (jdk 1.7)
    C'est malheureusement une contrainte pour moi.

    Ca devrait vous permettre de tester l'application.

    Vous verrez donc un listView qui contient des données.
    Vous verrez également 3 boutons: "Down" , "suite" et "EnUneFois".

    Le but est de démontrer que le comportement de mon ListView est différent quand je pousse sur "Down" et puis sur "Suite" que quand je pousse sur "EnUneFois".
    C'est un comportement étrange (le mot inacceptable du titre n'était pas très bien choisi) car le bouton "EnUneFois" ne fait qu'exécuter le code de "Down" et de "Suite".

    Pour réaliser le test:

    - lancer l'application
    - cliquer sur "Down"
    - cliquer sur "Suite"
    - constater que l'élément de valeur "un" est bien devenu le premier élément du listView et qu'il s'affiche avec son titre1 et son titre2. C'est le comportement attendu car comme on a changé la propriété "SiPolePosition" de cet élément, le lvObj.setCellFactory a été exécuté pour cet Item.


    -Fermer l'application
    -relancer l'application
    -cliquer sur "EnUneFois"
    -constater que l'élément de valeur "un" est aussi devenu le premier du ListView mais que le titre1 et titre2 ne sont pas affichés !

    Voici le fxml:

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.image.*?>
    <?import javafx.geometry.*?>
    <?import javafx.scene.text.*?>
    <?import java.lang.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
    <?import javafx.scene.layout.AnchorPane?>
     
    <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="chargementNouveauModele.view.DeveloppezController">
       <children>
          <ListView fx:id="lvObj" layoutX="30.0" layoutY="44.0" prefHeight="181.0" prefWidth="220.0" />
          <Button fx:id="cmdDown" alignment="BASELINE_LEFT" layoutX="68.0" layoutY="244.0" mnemonicParsing="false" onMouseClicked="#handleDown" prefHeight="33.0" prefWidth="104.0" text="Down" />
          <Button fx:id="cmdSuite" alignment="BASELINE_LEFT" layoutX="68.0" layoutY="284.0" mnemonicParsing="false" onMouseClicked="#handleSuite" prefHeight="33.0" prefWidth="104.0" text="suite" />
          <Label layoutX="30.0" layoutY="461.0" text="Nombre de lignes : " />
          <Label fx:id="lblNbrLignesFenetre" layoutX="140.0" layoutY="461.0" />
          <Button fx:id="cmdEnUneFois" alignment="BASELINE_LEFT" layoutX="190.0" layoutY="244.0" mnemonicParsing="false" onMouseClicked="#handleEnUneFois" prefHeight="33.0" prefWidth="104.0" text="EnUneFois" />
       </children>
    </AnchorPane>
    et voici mon controller:

    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
     
    package chargementNouveauModele.view;
     
     
     
    import javafx.beans.property.BooleanProperty;
    import javafx.beans.property.IntegerProperty;
    import javafx.beans.property.SimpleBooleanProperty;
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.fxml.FXML;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.Labeled;
    import javafx.scene.control.ListCell;
    import javafx.scene.control.ListView;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.scene.text.Text;
    import javafx.util.Callback;
     
    public class DeveloppezController {
     
     
     
    	@FXML
    	private Labeled lblNbrLignesFenetre;
    	@FXML
    	private Button cmdSuite;
    	@FXML
    	private Button cmdDown;
    	@FXML
    	private Button cmdEnUneFois;
     
    	@FXML
    	private ListView<ListElements> lvObj;
     
    	@FXML
    	private Labeled lblTest;
     
    	ObservableList<ListElements> olFull = FXCollections.observableArrayList(
    			new ListElements("A", "K", "zéro",true, true,false,3),
    			new ListElements("A", "K", "un",false, false, false,1),
    			new ListElements("A", "L", "deux",false, true, false,2),
    			new ListElements("B", "M", "trois",true, true, false,3),
    			new ListElements("B", "M", "quatre",false, false, false,1),
    			new ListElements("C", "N", "cinq",true, true, false,3)
    			);
     
    	ObservableList<ListElements> myActiveListEL= FXCollections.observableArrayList();
     
    	private Integer borneInf;
    	private Integer borneSup;
    	private Integer nbrElementSource;
    	private Integer nbrLignesSelection;
    	private ListElements myCurrentElement = new ListElements();
     
    	/**
             * The constructor.
             * The constructor is called before the initialize() method.
             */
    	public DeveloppezController() {
    	}
     
    	/**
             * Initializes the controller class. This method is automatically called
             * after the fxml file has been loaded.
             */
    	@FXML
    	private void initialize() {
     
    		borneInf=0;
    		borneSup=-1;
    		nbrElementSource= olFull.size();
    		nbrLignesSelection=0;
     
     
     
    		while ((nbrLignesSelection < 9) & (borneSup < nbrElementSource-1)){
    			borneSup +=1;
     
     
    			myCurrentElement =	olFull.get(borneSup);
     
     
     
    			if (borneSup == 0) {//premier élément
    				nbrLignesSelection +=3;
    				myCurrentElement.setSiPolePosition(true);
    			}
    			else
    			{
    				nbrLignesSelection += myCurrentElement.getNombreLignes();
     
    			};
    			myActiveListEL.add(olFull.get(borneSup));
    		}
     
    lvObj.setItems(myActiveListEL);
     
    		lvObj.setCellFactory(new Callback<ListView<ListElements>, ListCell<ListElements>>() {
     
                @Override
                public ListCell<ListElements> call(ListView<ListElements> arg0) {
                    return new ListCell<ListElements>() {
     
                        @Override
                        protected void updateItem(ListElements 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);
                            }
                        }
     
                    };
                }
     
            });
     
     
     
     
     
     
     
     
    	}
    	@FXML
    	private void handleDown(){
    		//retire le premier élément, calcule le nombre de lignes gagnées et, rajoute le ou les éléments supplémentaires
     
    				if (borneSup <nbrElementSource-1)// le bouton n'agit plus quand je suis en bas de ma source
    				{
    					borneInf +=1;
    					nbrLignesSelection -= myActiveListEL.get(1).getNombreLignes();
     
    					myActiveListEL.remove(0);
     
    					myActiveListEL.get(0).setSiPolePosition(true);
     
     
    				}
     
    	}
    	@FXML
    	private void handleSuite(){
    		//maintenant on rajoute un élément en fin de liste
    				// à la condition que j'aie assez de lignes disponibles
     
    				myCurrentElement = olFull.get(borneSup+1);
    				if (9- nbrLignesSelection >= myCurrentElement.getNombreLignes())
    				{
    					nbrLignesSelection += myCurrentElement.getNombreLignes();
     
    					borneSup+=1;
    					myActiveListEL.add(olFull.get(borneSup));
    				}
    	}
    	@FXML
    	private void handleEnUneFois(){
    		handleDown();
    		handleSuite();
     
    	}
     
     
     
     
    	private class ListElements {
     
    		private final StringProperty titre1;
    	    private final StringProperty titre2;
    	    private final StringProperty valeur;
    	    private final BooleanProperty siPremierTitre1;
    	    private final BooleanProperty siPremierTitre2;
    	    private final BooleanProperty siPolePosition;
    	    private final IntegerProperty nombreLignes;
     
     
    	    private ListElements(String t1, String t2, String v , Boolean sit1,Boolean sit2, Boolean siPolePos, Integer nbrLignes) {
    	       this.titre1 = new SimpleStringProperty(t1);
    	       this.titre2 =new SimpleStringProperty(t2);
    	       this.valeur = new SimpleStringProperty(v);
    	       this.siPremierTitre1 = new SimpleBooleanProperty(sit1) ;
    	       this.siPremierTitre2 = new SimpleBooleanProperty(sit2) ;
    	       this.siPolePosition= new SimpleBooleanProperty(siPolePos);
    	       this.nombreLignes= new SimpleIntegerProperty(nbrLignes);
    	    }
     
    	    private ListElements() {
    	        this.titre1 = new SimpleStringProperty(null);
    	        this.titre2 =new SimpleStringProperty(null);
    	        this.valeur = new SimpleStringProperty(null);
    	        this.siPremierTitre1 = new SimpleBooleanProperty(false) ;
    	        this.siPremierTitre2 = new SimpleBooleanProperty(false) ;
    	        this.siPolePosition= new SimpleBooleanProperty(false);
    	        this.nombreLignes= new SimpleIntegerProperty(0);
    	     }
     
     
     
    	    private String getTitre1() {
    	        return titre1.get();
    	    }
     
     
    	    private String getTitre2() {
    	        return titre2.get();
    	    }
     
     
     
    	    private String getValeur() {
    	        return valeur.get();
    	    }
     
     
    	    private Boolean getSiPremierTitre1() {
    	        return siPremierTitre1.get();
    	    }
     
     
    	    private Boolean getSiPremierTitre2() {
    	        return siPremierTitre2.get();
    	    }
     
     
    	    private Boolean getSiPolePosition() {
    	        return siPolePosition.get();
    	    }
     
    	    private void setSiPolePosition(Boolean SiPolePosition) {
    	        this. siPolePosition.set( SiPolePosition);
    	    }
     
    	    private Integer getNombreLignes() {
    	        return nombreLignes.get();
    	    }
     
    	}
     
     
     
     
    }
    J'en déduis donc que quand je pousse sur "EnUneFois", le lvObj.setCellFactory n'a pas été exécuté pour mon premier item.
    Ma question est de savoir si on peut "forcer" le setCellFactory pour un Item déterminé.

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 875
    Points : 22 942
    Points
    22 942
    Billets dans le blog
    53
    Par défaut
    Déjà, il y a une différence majeure entre cliquer sur 1) "Down"+"Suite" et 2) "EnUneFois" c'est que dans :
    1. Dans ce cas, il y a eut plusieurs pulses (d'affichage) du SceneGraph entre chaque clic et donc que le contenu du SceneGraphea été modifié à l’écran ce qui implique probablement la modification du contenu des cellules.
    2. Dans ce cas la modification de liste bloque complètement le ré-affichage tant que les deux actions ne sont pas finies. L'affichage de la liste graphique et de ses cellules sont donc modifiés après coup.


    Je rappelle d'ailleurs que les cellules ne sont pas recréées : elles sont réutilisées. De nouvelles cellules sont creees quand tu scrolles (1-2 pour le scroll) ou quand tu agrandis l'affichage vertical de la liste (une nouvelle cellule pour chaque nouvelle ligne visible).

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 875
    Points : 22 942
    Points
    22 942
    Billets dans le blog
    53
    Par défaut
    Ok, donc j'ai rajoute a la fin de handleSuite() (je suis en JDK 8 mais le problème se pose a l'identique) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myActiveListEL.forEach(System.out::println);
    Et dans ListElements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
    public String toString() {
        return String.format("%s - %s - %s \t %b %b %b %d", titre1.get(), titre2.get(), valeur.get(), siPremierTitre1.get(), siPremierTitre2.get(), siPolePosition.get(), nombreLignes.get());
    }
    Ce qui montre bien que la liste observable finale est la meme lors des deux modifs :

    Code 1) : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A - K - un 	 false false true 1
    A - L - deux 	 false true false 2
    B - M - trois 	 true true false 3
    B - M - quatre 	 false false false 1

    Code 2) : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A - K - un 	 false false true 1
    A - L - deux 	 false true false 2
    B - M - trois 	 true true false 3
    B - M - quatre 	 false false false 1

    Le problème se site donc bien dans la cellule qui ne rafraichit pas son contenu probablement tout simplement car elle n'enregistre aucun écouteur sur les propriétés de l'objet.

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 875
    Points : 22 942
    Points
    22 942
    Billets dans le blog
    53
    Par défaut
    Donc le probleme est que tu essaie de faire un truc trop complique pour une cellule trop simple.

    Je te propose donc de modifier le code de ta cellule pour faire a la place :

    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
    return new ListCell<ListElements>() {
     
        private final VBox vBox = new VBox();
        private ListElements oldElement;
     
        @Override
        protected void updateItem(ListElements item, boolean bln) {
            super.updateItem(item, bln);
            Node graphics = null;
            if (oldElement != null) {
                oldElement.titre1.removeListener(itemInvalidationListener);
                oldElement.titre2.removeListener(itemInvalidationListener);
                oldElement.valeur.removeListener(itemInvalidationListener);
                oldElement.siPolePosition.removeListener(itemInvalidationListener);
                oldElement.siPremierTitre1.removeListener(itemInvalidationListener);
                oldElement.siPremierTitre2.removeListener(itemInvalidationListener);
                oldElement.nombreLignes.removeListener(itemInvalidationListener);
                oldElement = null;
                vBox.getChildren().clear();
            }
            if (!bln && item != null) {
                oldElement = item;
                oldElement.titre1.addListener(itemInvalidationListener);
                oldElement.titre2.addListener(itemInvalidationListener);
                oldElement.valeur.addListener(itemInvalidationListener);
                oldElement.siPolePosition.addListener(itemInvalidationListener);
                oldElement.siPremierTitre1.addListener(itemInvalidationListener);
                oldElement.siPremierTitre2.addListener(itemInvalidationListener);
                oldElement.nombreLignes.addListener(itemInvalidationListener);
                updateContent(item);
                graphics = vBox;
            }
            setGraphic(graphics);
        }
     
        private final InvalidationListener itemInvalidationListener = new InvalidationListener() {
     
            @Override
            public void invalidated(Observable observable) {
                updateContent(oldElement);
            }
        };
     
        private void updateContent(final ListElements item) {
            vBox.getChildren().clear();
            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);
        }
    };
    Ceci permettra a ta cellule de modifier correctement son contenu lorsque une ou plusieurs propriétés d'un élément changent.

    Bien sur il y a des optimisations a faire comme :
    • Ne pas s’embêter a faire tous les dés-enregistrements / enregistrements de listeneur quand l'ancien objet et le nouveau sont les mêmes.
    • Bufferiser les appels a updateContent() pour éviter un storm lorsque trop de propriétés changent a la fois et éviter ainsi la création de gazillions de composants graphiques.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Bonjour,

    Super merci pour cette élégante solution.

    Je peux effectivement optimiser en ne gardant que le listener sur "SiPolePosition" qui est le seul susceptible de nécessiter un rafraichissement.

    Tu m'intéresses grandement en parlant de bufférisation mais je laisse ça pour un prochain sujet!
    Problème résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. contrôle sur un bouton
    Par allowen dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/01/2006, 15h07
  2. Réponses: 4
    Dernier message: 22/12/2005, 18h05
  3. contrôle sur un champ dans un formulaire
    Par yoline dans le forum Access
    Réponses: 6
    Dernier message: 01/10/2005, 20h23
  4. Génération d'une clé de contrôle sur un nombre
    Par soulryo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/02/2005, 15h50
  5. [Access] Manque d'idées sur une requête
    Par portu dans le forum Langage SQL
    Réponses: 12
    Dernier message: 22/11/2004, 13h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo