Bonjour,
Mon tableViewer alimente mon tableau. Mon tableviewer a comme entrée un modèle basé sur une liste de tableau de String.
Soit List<String[]>
Chaque ligne du tableau (chaque String[] dans le modèle) contient une valeur booléenne qui est représentée par une image qui est une icone rouge si la valeur est "false" et une icone verte si la valeur est "true"
Au départ, toutes les lignes sont à "false" (image rouge). Je parcours avec une boucle for les lignes et je mets "true" à la bonne colonne.
Je souhaite trouver un moyen de mettre à jour la fenêtre et donc de changer l'image en image verte..
Pour ça je modifie mon modèle, c'est à dire le tableau String[] et je tente de rafraîchir ma vue.
Le problème est que mon affichage transforme mon image rouge en verte seulement à la fin de ma boucle for et non à chaque iteration.
Donc à la fin du parcours de toutes les lignes du tableau j'ai toutes mes lignes qui passent au vert d'un coup !
Je vous donne un bout du code du MODELE, c'est une liste de tableau de chaînes de caractères (string[]) :
Je vous donne le bout de code du CONTROLEUR réalisant la modification :
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 //-------------------Création des éléments du modèle List<String[]> elements; public MyModele() { elements = new ArrayList<String[]>(); //j'aoute cinq lignes à ma listes for (int i = 0 ; i<5 ; i++) { String[] row = {"col0", "col1", "col2", "col3", "col4", "false"}; elements.add(row); } } //-----------------------Création des images. static Display display = null; static ImageRegistry imageRegistry; static { display = Display.getDefault();//new Display(); imageRegistry = new ImageRegistry(display); imageRegistry.put("Finished", new Image(display, myModele.class.getResourceAsStream("/files/img/finished.gif")) ); imageRegistry.put("NotFinished", new Image(display, myModele.class.getResourceAsStream("/files/img/notfinished.gif")) ); } public static Image getFinishedImage(boolean b) { if (b) return (Image)(imageRegistry.get("Finished")); else return (Image)(imageRegistry.get("NotFinished")); }
J'aimerai que mon image soit changée à chaque iteration comme le code le demande mais mon affichage est mis à jour seulement après traitement de toutes les lignes. Comment puis-je y remédier ?
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 List<String[]> myModele = (List<String[]>)(theView.getModel()); //analyse each table row for (String[] row : myModel) { row[5] = "true"; //la colonne avec l'image change d'état final String[] rr = row; display.syncExec(new Runnable() { public void run() { theView.getTableViewer().refresh(); } }); //Un petit sleep sinon ça va trop vite pour l'oeil :-) try { Thread.sleep(500); } catch (Throwable th) {} System.out.println("\t This line is finished"); } //end for
Ici le CONTENTPROVIDER :
Ici le LABELPROVIDER :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public class MyModeleContentProvider implements IStructuredContentProvider { public Object[] getElements(Object inputElement) { List myList = (List) inputElement; return myList.toArray(); } public void inputChanged(Viewer viewer, Object old_object, Object new_object){} public void dispose() {} }
Merci pour vos prochaines réponses.
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 public class MyModeleProvider implements ITableLabelProvider { public String getColumnText(Object element, int columnIndex) { String[] row = (String[])element; if (columnIndex != 5 ) return row[columnIndex]; //Si c'est la colonne avec le booléen je mets une image. return ""; } public void dispose() {} public Image getColumnImage(Object element, int columnIndex) { String[] row = (String[])element; if (columnIndex == 5) { return MyModele.getFinishedImage(Boolean.valueOf(row[columnIndex])); } return null; } public boolean isLabelProperty(Object element, String property){return false;} public void addListener (ILabelProviderListener l){} public void removeListener (ILabelProviderListener l){} }
Partager