Bonjour,
J'ai une application RCP avec une vue contenant un tableau, et j'aimerais pouvoir trier ce tableau en cliquant sur les colonnes.
J'ai essayé d'implémenter ceci à l'aide d'un viewerComparator, mais ça me rajoute des lignes dans mon tableau.
Voici ce que j'ai :
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 abstract class MyViewerSorter extends ViewerComparator { public static final int ASC = 1; public static final int NONE = 0; public static final int DESC = -1; private int direction = 0; private TreeViewerColumn column; private TreeViewer viewer; public MyViewerSorter(TreeViewer viewer, TreeViewerColumn column) { this.column = column; this.viewer = viewer; this.column.getColumn().addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { if( MyViewerSorter.this.viewer.getComparator() != null ) { if( MyViewerSorter.this.viewer.getComparator() == MyViewerSorter.this ) { int tdirection = MyViewerSorter.this.direction; if( tdirection == ASC ) { setSorter(MyViewerSorter.this, DESC); } else if( tdirection == DESC ) { setSorter(MyViewerSorter.this, NONE); } } else { setSorter(MyViewerSorter.this, ASC); } } else { setSorter(MyViewerSorter.this, ASC); } } }); } public void setSorter(MyViewerSorter sorter, int direction) { if( direction == NONE ) { column.getColumn().getParent().setSortColumn(null); column.getColumn().getParent().setSortDirection(SWT.NONE); viewer.setComparator(null); } else { column.getColumn().getParent().setSortColumn(column.getColumn()); sorter.direction = direction; if( direction == ASC ) { column.getColumn().getParent().setSortDirection(SWT.DOWN); } else { column.getColumn().getParent().setSortDirection(SWT.UP); } if( viewer.getComparator() == sorter ) { viewer.refresh(); } else { viewer.setComparator(sorter); } } } public int compare(Viewer viewer, Object e1, Object e2) { return direction * doCompare(viewer, e1, e2); } protected abstract int doCompare(Viewer viewer, Object e1, Object e2); }Qu'est-ce qui est faux? Y a-t-il une meilleure façon d'effectuer un tri?
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 public class VueListe extends ViewPart{ private TreeViewer viewer; private ModeleImpl modele; public void createPartControl(Composite parent) { modele = new Modele(); viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(new Liste()); Tree tree = viewer.getTree(); final TreeViewerColumn colNom = new TreeViewerColumn(viewer, SWT.CENTER); colTache.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if (element instanceof Personne) { Personne per = (Personne) element; return per.getNom(); } return null; } }); colNom.getColumn().setText("Nom"); MyViewerSorter cSorter = new MyViewerSorter(viewer,colNom) { protected int doCompare(Viewer viewer, Object e1, Object e2) { Personne p1 = (Personne) e1; Personne p2 = (Personne) e2; return p1.getNom().compareToIgnoreCase(p2.getNom()); } }; TreeViewerColumn colPrenom = new TreeViewerColumn(viewer, SWT.CENTER); colPrior.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if (element instanceof Personne) { Personne p = (Personne) element; return p.getPrenom(); } return null; } }); colPrior.getColumn().setText("Prenom"); // Provide the input to the ContentProvider viewer.setInput(modele); for (int i = 0, n = tree.getColumnCount(); i < n; i++) { tree.getColumn(i).setWidth(100); } tree.setHeaderVisible(true); tree.setLinesVisible(true); // Expand the tree viewer.expandAll(); }
Merci beaucoup
Partager