Bonjour,
J'ai une liste de MyObject que je veux mettre dans un tableau, chaque colonne du tableau correspondant à une propriété de chaque instance de MyObject. Sur ce tableau, je veux :
- Faire apparaître un menu contextuel sur des lignes pour appliquer des traitements à l'instance de MyObject correspondant
- Pouvoir réordonner les lignes suivant une colonne
Pour régler le 1er point, j'ajoute au niveau du TableModel l'instance de MyObject pour pouvoir la récupérer lors de l'utilisation du menu contextuel
Pour régler le 2ème point, j'utilise la classe proposée par Sun ici
Mais ces 2 solutions cohabitent mal:
- Le fait d'ajouter les instances de MyObject dans le tablemodel fait que le tri ne marche pas. J'ai essayé de modifier la méthode compareTo de la classe Row dans MyTableSorter mais cela impose que cela soit toujours la même propriété de MyObject qui soit présente dans la tablemodel sous forme de MyObject (en utilisant un renderer dans la table) et que les autres soient sous la forme de String (par exemple)
- Si je mets les valeurs des champs dans le tablemodel, alors je ne peux plus accéder aux instances de MyObject.
Comment faire pour que les deux points ci-dessus marchent simultanément![]()
Merci d'avance pour votre aide![]()
Pour informations, voilà des bouts de code et le détail des classes
Construction de la table
classe MyObject
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 MyTableModel tableModel = new MyTableModel (); tableModel.fillTable(); MyTableSorter tableSorter = new MyTableSorter(tableModel ); MyTable table = new MyTable (tableSorter); tableSorter.setTableHeader(table.getTableHeader()); JScrollPane tableScroll = new JScrollPane(table);
Classe MyTable
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 public class MyObject { public MyObject() { } public void setName(String name) { _name = name; } public void setFirstName(String firstName) { _firstName = firstName; } public String getName() { return _name; } public String getFirstName() { return _firstName; } private String _name; private String _firstName; }
Classe MyTableModel
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 public class MyTable extends JTable implements MouseListener { public MyTable(Vector datas, Vector columNames) { super(datas, columNames); addMouseListener(this); } public MyTable(TableModel tableModel) { super(tableModel); addMouseListener(this); // Rendu de la colonne #1 DefaultTableCellRenderer c1Renderer = new DefaultTableCellRenderer() { public void setValue(Object value) { MyObject obj = (MyObject)value; String val = obj.getName(); setText(val); } }; getColumnModel().getColumn(0).setCellRenderer(c1Renderer); // Rendu de la colonne #2 DefaultTableCellRenderer c2Renderer = new DefaultTableCellRenderer() { public void setValue(Object value) { MyObject obj = (MyObject)value; String val = obj.getFirstName(); setText(val); } }; getColumnModel().getColumn(1).setCellRenderer(c2Renderer); } // ****************************************** // MouseListener interface // ****************************************** public void mouseClicked(MouseEvent e) { int currentLine = rowAtPoint(e.getPoint()); if (e.getButton() == MouseEvent.BUTTON3) { if (_popUp == null) { _popUp = new JPopupMenu(); _menuItemEdit = new JMenuItem("Editer"); _menuItemEdit.addMouseListener(this); _popUp.add(_menuItemEdit); } _popUp.show(this, e.getX(), e.getY()); changeSelection(currentLine, -1, false, false); } } public void mousePressed(MouseEvent e) { _popUp.setVisible(false); // Récupération de l'objet sélectionné MyObject obj = (MyObject)getValueAt(getSelectedRow(), 0); if (e.getSource() == _menuItemEdit) { // Edition de obj } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } private JPopupMenu _popUp; private JMenuItem _menuItemEdit; }
Classe MyTableSorter : C'est la classe proposée par Sun dans le tutorial mais voici le détail de la méthode compareTo
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 public class MyTableModel extends DefaultTableModel { public MyTableModel() { super(); addColumn("Nom"); addColumn("Prénom"); } public MyTableModel(Object[] columnNames) { super(columnNames, 0); } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } public void fillTable() { removeAllRows(); // Réalisation de la requête ArrayList persons = ...; for (int i=0; i <= persons.size(); i++) addRow((MyObject)persons.get(i)); } private void addRow(MyObject obj) { Vector tmp = new Vector(); tmp.add(obj); // Nom tmp.add(obj); // Prénom addRow(tmp); } private void removeAllRows() { setRowCount(0); } }
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 public int compareTo(Object o) { int row1 = modelIndex; int row2 = ((Row) o).modelIndex; for (Iterator it = sortingColumns.iterator(); it.hasNext();) { Directive directive = (Directive) it.next(); int column = directive.column; Object o1 = tableModel.getValueAt(row1, column); Object o2 = tableModel.getValueAt(row2, column); int comparison = 0; if ((o1 instanceof MyObject) && (o2 instanceof MyObject)) { MyObject obj1 = (MyObject)o1, obj2 = (MyObject)o2; o1 = new String(obj1.getName()); o2 = new String(obj1.getName()); ... } } }
Partager