J'ai à nouveau une autre question concernant encore le header. Comment fait on pour effectuer un gestionnaire d'évènement sur cette partie. C'est à dire quand je clique sur une case à cocher du header je veux qu'elle change d'état
J'ai à nouveau une autre question concernant encore le header. Comment fait on pour effectuer un gestionnaire d'évènement sur cette partie. C'est à dire quand je clique sur une case à cocher du header je veux qu'elle change d'état
J'ai adapté un peu ton code pour que tu ais déjà une première 'entrevue de solution' :
A noter que tu as inclu les libellés 'Lundi', 'Mardi' de tes supposées colonnes dans les données. Peut-être vaudrait-il mieux utiliser ces libellés dans le CheckBoxHeader.
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
268 public class TableauDispo extends JTable { private Object[][] dispo; /** * Constructeur de la classe */ public TableauDispo() { super(); //Création du tableau de disponibilité (arg1=valeur de chaque ligne et arg2=nom colonne) dispo=new Object[][] { {"Tous","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"}, {false, "","","","","","",""},//ligne 1 {false, "","","","","","",""},//ligne 2 {false, "","","","","","",""},//ligne 3 {false, "","","","","","",""},//ligne 4 {false, "","","","","","",""},//ligne 5 {false, "","","","","","",""},//ligne 6 {true, "","","","","","",""},//ligne 7 {false, "","","","","","",""},//ligne 8 {false, "","","","","","",""},//ligne 9 {false, "","","","","","",""},//ligne 10 {false, "","","","","","",""},//ligne 11 {false, "","","","","","",""},//ligne 12 {false, "","","","","","",""},//ligne 13 {false, "","","","","","",""},//ligne 14 {false, "","","","","","",""},//ligne 15 {false, "","","","","","",""},//ligne 16 }; this.setAutoCreateColumnsFromModel(false); DefaultTableModel model = null; this.setModel(new DefaultTableModel( dispo, //Valeur du tableau new Object[]{ new HeaderValue("Tous"), new HeaderValue("Lundi"), new HeaderValue("Mardi"), new HeaderValue("Mercredi"), new HeaderValue("Jeudi"), new HeaderValue("Vendredi"), new HeaderValue("Samedi"), new HeaderValue("Dimanche") } ) ); Object[] titles = new Object[]{ new HeaderValue("Tous"), new HeaderValue("Lundi"), new HeaderValue("Mardi"), new HeaderValue("Mercredi"), new HeaderValue("Jeudi"), new HeaderValue("Vendredi"), new HeaderValue("Samedi"), new HeaderValue("Dimanche")}; for(int i = 0; i < titles.length; i++) { TableColumn col = new TableColumn(i); col.setHeaderValue(titles[i]); this.getTableHeader().getColumnModel().addColumn(col); } this.getTableHeader().setDefaultRenderer(new CheckBoxHeader()); this.getTableHeader().addMouseListener(new MouseAdapter() { /** * Invoked when the mouse has been clicked on a component. */ public void mouseClicked(MouseEvent e) { /** déterminer la colonne où a eu lieu le click */ int colIndex = getTableHeader().columnAtPoint(e.getPoint()); if ( colIndex >= 0 && colIndex < getColumnModel().getColumnCount() ) { TableColumn column = getColumnModel().getColumn(colIndex); if ( column != null ) { Object value = column.getHeaderValue(); System.out.println("identifier : " + column.getIdentifier().getClass()); System.out.println("header value : " + column.getHeaderValue().getClass()); System.out.println("value is : " + value.getClass()); System.out.println("instanceof HeaderValue ? " + (value instanceof HeaderValue)); if ( value instanceof HeaderValue ) { ((HeaderValue)value).selected = ! ((HeaderValue)value).selected.booleanValue(); System.out.println("selected ? " + ((HeaderValue)value).selected); AbstractTableModel model = (AbstractTableModel)getModel(); model.fireTableStructureChanged(); // model.fireTableChanged(new TableModelEvent(model, TableModelEvent.HEADER_ROW, TableModelEvent.HEADER_ROW, colIndex, colIndex)); } } } } }); this.getColumnModel().getColumn(0).setCellRenderer(new CheckBoxRenderer()); } /** * Classe CheckBoxRenderer */ private static class CheckBoxRenderer extends JCheckBox implements TableCellRenderer { public CheckBoxRenderer() { } /* (non-Javadoc) * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int) */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if(row==0) {this.setText("Tous");return null;} if(value.toString()=="true" || value.toString()=="false") { this.setSelected((Boolean) value); //Gestion de l'affichage du texte switch(row) { //case 0: this.setText("Tous");break; case 1 : this.setText("6-7"); break; case 2 : this.setText("7-8"); break; case 3 : this.setText("8-9"); break; case 4 : this.setText("9-10"); break; case 5 : this.setText("10-11"); break; case 6 : this.setText("11-12"); break; case 7 : this.setText("12-13"); break; case 8 : this.setText("13-14"); break; case 9 : this.setText("14-15"); break; case 10 : this.setText("15-16"); break; case 11 : this.setText("16-17"); break; case 12 : this.setText("17-18"); break; case 13 : this.setText("18-19"); break; case 14 : this.setText("19-20"); break; case 15 : this.setText("20-21"); break; case 16 : this.setText("21-22"); break; default: this.setText(""); break; } } return this; } } /** * Définition d'une classe pour l'en-tête de la JTable * Cette classe permet de créer des cases à cocher sur la première ligne de la * JTable */ public static class CheckBoxHeader extends JCheckBox implements TableCellRenderer { /** * Constructeur de la classes * @param texte */ public CheckBoxHeader() { } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if ( value instanceof HeaderValue ) { this.setSelected( ((HeaderValue)value).selected ); // this.setSelected((Boolean) value); //Gestion de l'affichage du texte // switch(column) { // case 0: this.setText("Tous");break; // case 1 : this.setText("Lundi"); break; // case 2 : this.setText("Mardi"); break; // case 3 : this.setText("Mercredi"); break; // case 4 : this.setText("Jeudi"); break; // case 5 : this.setText("Vendredi"); break; // case 6 : this.setText("Samedi"); break; // case 7 : this.setText("Dimanche"); break; // default: this.setText(""); break; // } } return this; } } /** * Label * */ private static class LabelRenderer extends JLabel implements TableCellRenderer { public LabelRenderer(Color couleur) { super(); //this.setName("0"); setBackground(couleur); } /* (non-Javadoc) * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int) */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setOpaque(true); if (isSelected) { setBackground(Color.blue); } return this; } } /** * @param args */ public static void main(String[] args) { // TODO Raccord de méthode auto-généré TableauDispo t=new TableauDispo(); //Ajout d'une frame JFrame frame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); frame.getContentPane().add(new JScrollPane(t)); frame.pack(); frame.setVisible(true); } private class HeaderValue { /** text */ private String text = null; /** selected */ private Boolean selected = Boolean.FALSE; public HeaderValue(String text) { this(text, Boolean.FALSE); } public HeaderValue(String text, Boolean selected) { this.text = text; this.selected = selected; } } }
merci pour la solution. Et pour les intitulés de mes colonnes je voulais en effet les ajouter dans mon checkboxheader mais je m'y suis mal prise (>_<")
Sinon est ce qu'il est possible de faire la même choses pour la première colonne de mon JTable ?
là, c'est un peu plus simple à faire. ajoute cela à la fin du constructeur de ta JTable :
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 this.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox()) { @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { Component c = super.getTableCellEditorComponent(table, value, isSelected, row, column); if ( c instanceof JCheckBox ) { switch(row) { case 1 : ((JCheckBox)c).setText("6-7"); break; case 2 : ((JCheckBox)c).setText("7-8"); break; case 3 : ((JCheckBox)c).setText("8-9"); break; case 4 : ((JCheckBox)c).setText("9-10"); break; case 5 : ((JCheckBox)c).setText("10-11"); break; case 6 : ((JCheckBox)c).setText("11-12"); break; case 7 : ((JCheckBox)c).setText("12-13"); break; case 8 : ((JCheckBox)c).setText("13-14"); break; case 9 : ((JCheckBox)c).setText("14-15"); break; case 10 : ((JCheckBox)c).setText("15-16"); break; case 11 : ((JCheckBox)c).setText("16-17"); break; case 12 : ((JCheckBox)c).setText("17-18"); break; case 13 : ((JCheckBox)c).setText("18-19"); break; case 14 : ((JCheckBox)c).setText("19-20"); break; case 15 : ((JCheckBox)c).setText("20-21"); break; case 16 : ((JCheckBox)c).setText("21-22"); break; default: ((JCheckBox)c).setText(""); break; } } return c; } });
Mais du coup quand je veux définir par défaut que l'en tête de la colonne 3 par exemple est à true
je ne peux plus utiliser ce que tu m'as dis précédement
Code : Sélectionner tout - Visualiser dans une fenêtre à part this.getColumnModel().getColumn(3).setHeaderValue(Boolean.TRUE);
si tu pars sur l'utilisation d'objets HeaderValue en tant que valeur de colonne,
il faut d'abord que tu initialises l'attribut 'selected' de chaque HeaderValue lors de la construction du ColumnModel (dans le constructeur TableauDispo).
Il vaut mieux que je fasse un petit exemple plutot que de m'embarquer dans un long discours...
Avec ca, tu peux voir que le fait d'appuyer sur le bouton va modifier l'état de la colonne 3. Je suis pas certain qu'appeler repaint sur le TableHeader soit la solution la plus appropriée.
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
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381 import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.WindowConstants; import javax.swing.event.TableModelEvent; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; /** * * @author root */ public class TableauDispo extends JTable { private Object[][] dispo; /** * Constructeur de la classe */ public TableauDispo() { super(); //Création du tableau de disponibilité (arg1=valeur de chaque ligne et arg2=nom colonne) dispo=new Object[][] { {"Tous","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"}, {false, "","","","","","",""},//ligne 1 {false, "","","","","","",""},//ligne 2 {false, "","","","","","",""},//ligne 3 {false, "","","","","","",""},//ligne 4 {false, "","","","","","",""},//ligne 5 {false, "","","","","","",""},//ligne 6 {true, "","","","","","",""},//ligne 7 {false, "","","","","","",""},//ligne 8 {false, "","","","","","",""},//ligne 9 {false, "","","","","","",""},//ligne 10 {false, "","","","","","",""},//ligne 11 {false, "","","","","","",""},//ligne 12 {false, "","","","","","",""},//ligne 13 {false, "","","","","","",""},//ligne 14 {false, "","","","","","",""},//ligne 15 {false, "","","","","","",""},//ligne 16 }; this.setAutoCreateColumnsFromModel(false); DefaultTableModel model = null; this.setModel(new DefaultTableModel( dispo, //Valeur du tableau new Object[]{ new HeaderValue("Tous"), new HeaderValue("Lundi"), new HeaderValue("Mardi"), new HeaderValue("Mercredi"), new HeaderValue("Jeudi"), new HeaderValue("Vendredi"), new HeaderValue("Samedi"), new HeaderValue("Dimanche") } ) ); Object[] titles = new Object[]{ new HeaderValue("Tous"), new HeaderValue("Lundi"), new HeaderValue("Mardi"), new HeaderValue("Mercredi"), new HeaderValue("Jeudi"), new HeaderValue("Vendredi"), new HeaderValue("Samedi"), new HeaderValue("Dimanche")}; for(int i = 0; i < titles.length; i++) { TableColumn col = new TableColumn(i); col.setHeaderValue(titles[i]); this.getTableHeader().getColumnModel().addColumn(col); } this.getTableHeader().setDefaultRenderer(new CheckBoxHeader()); this.getTableHeader().addMouseListener(new MouseAdapter() { /** * Invoked when the mouse has been clicked on a component. */ public void mouseClicked(MouseEvent e) { /** déterminer la colonne où a eu lieu le click */ int colIndex = getTableHeader().columnAtPoint(e.getPoint()); if ( colIndex >= 0 && colIndex < getColumnModel().getColumnCount() ) { TableColumn column = getColumnModel().getColumn(colIndex); if ( column != null ) { Object value = column.getHeaderValue(); System.out.println("identifier : " + column.getIdentifier().getClass()); System.out.println("header value : " + column.getHeaderValue().getClass()); System.out.println("value is : " + value.getClass()); System.out.println("instanceof HeaderValue ? " + (value instanceof HeaderValue)); if ( value instanceof HeaderValue ) { ((HeaderValue)value).selected = ! ((HeaderValue)value).selected.booleanValue(); System.out.println("selected ? " + ((HeaderValue)value).selected); AbstractTableModel model = (AbstractTableModel)getModel(); model.fireTableStructureChanged(); // model.fireTableChanged(new TableModelEvent(model, TableModelEvent.HEADER_ROW, TableModelEvent.HEADER_ROW, colIndex, colIndex)); } } } } }); this.getColumnModel().getColumn(0).setCellRenderer(new CheckBoxRenderer()); this.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox()) { @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { Component c = super.getTableCellEditorComponent(table, value, isSelected, row, column); if ( c instanceof JCheckBox ) { switch(row) { case 1 : ((JCheckBox)c).setText("6-7"); break; case 2 : ((JCheckBox)c).setText("7-8"); break; case 3 : ((JCheckBox)c).setText("8-9"); break; case 4 : ((JCheckBox)c).setText("9-10"); break; case 5 : ((JCheckBox)c).setText("10-11"); break; case 6 : ((JCheckBox)c).setText("11-12"); break; case 7 : ((JCheckBox)c).setText("12-13"); break; case 8 : ((JCheckBox)c).setText("13-14"); break; case 9 : ((JCheckBox)c).setText("14-15"); break; case 10 : ((JCheckBox)c).setText("15-16"); break; case 11 : ((JCheckBox)c).setText("16-17"); break; case 12 : ((JCheckBox)c).setText("17-18"); break; case 13 : ((JCheckBox)c).setText("18-19"); break; case 14 : ((JCheckBox)c).setText("19-20"); break; case 15 : ((JCheckBox)c).setText("20-21"); break; case 16 : ((JCheckBox)c).setText("21-22"); break; default: ((JCheckBox)c).setText(""); break; } } return c; } }); } /** permet de connaitre l'état d'activation d'une colonne dans l'entête * @param index l'index de la colonne que l'on souhaite activer ou non */ public boolean isColumnSelected(int index) { boolean activated = false; Object o = this.getColumnModel().getColumn(index).getHeaderValue(); if ( o instanceof HeaderValue ) { activated = ((HeaderValue)o).selected; } return activated; } /** permet de modifier l'activation d'une colonne dans l'entête * @param index l'index de la colonne que l'on souhaite activer ou non * @param selected un booléen */ public void setColumnSelected(int index, boolean selected) { Object o = this.getColumnModel().getColumn(index).getHeaderValue(); if ( o instanceof HeaderValue ) { /** on change l'attribut selected du HeaderValue correspondant */ ((HeaderValue)o).selected = selected; /** et on avertit la table qu'elle doit se rafraichir * appeler repaint est peut-être pas génial */ this.getTableHeader().repaint(); } } /** * Classe CheckBoxRenderer */ private static class CheckBoxRenderer extends JCheckBox implements TableCellRenderer { public CheckBoxRenderer() { } /* (non-Javadoc) * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int) */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if(row==0) {this.setText("Tous");return null;} if(value.toString()=="true" || value.toString()=="false") { this.setSelected((Boolean) value); //Gestion de l'affichage du texte switch(row) { //case 0: this.setText("Tous");break; case 1 : this.setText("6-7"); break; case 2 : this.setText("7-8"); break; case 3 : this.setText("8-9"); break; case 4 : this.setText("9-10"); break; case 5 : this.setText("10-11"); break; case 6 : this.setText("11-12"); break; case 7 : this.setText("12-13"); break; case 8 : this.setText("13-14"); break; case 9 : this.setText("14-15"); break; case 10 : this.setText("15-16"); break; case 11 : this.setText("16-17"); break; case 12 : this.setText("17-18"); break; case 13 : this.setText("18-19"); break; case 14 : this.setText("19-20"); break; case 15 : this.setText("20-21"); break; case 16 : this.setText("21-22"); break; default: this.setText(""); break; } } return this; } } /** * Définition d'une classe pour l'en-tête de la JTable * Cette classe permet de créer des cases à cocher sur la première ligne de la * JTable */ public static class CheckBoxHeader extends JCheckBox implements TableCellRenderer { /** * Constructeur de la classes * @param texte */ public CheckBoxHeader() { } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if ( value instanceof HeaderValue ) { this.setSelected( ((HeaderValue)value).selected ); // this.setSelected((Boolean) value); //Gestion de l'affichage du texte // switch(column) { // case 0: this.setText("Tous");break; // case 1 : this.setText("Lundi"); break; // case 2 : this.setText("Mardi"); break; // case 3 : this.setText("Mercredi"); break; // case 4 : this.setText("Jeudi"); break; // case 5 : this.setText("Vendredi"); break; // case 6 : this.setText("Samedi"); break; // case 7 : this.setText("Dimanche"); break; // default: this.setText(""); break; // } } return this; } } /** * Label * */ private static class LabelRenderer extends JLabel implements TableCellRenderer { public LabelRenderer(Color couleur) { super(); //this.setName("0"); setBackground(couleur); } /* (non-Javadoc) * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int) */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setOpaque(true); if (isSelected) { setBackground(Color.blue); } return this; } } /** * @param args */ public static void main(String[] args) { // TODO Raccord de méthode auto-généré final TableauDispo t=new TableauDispo(); //Ajout d'une frame JFrame frame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); JPanel panel = new JPanel(); panel.add(new JScrollPane(t)); JButton button = new JButton("change activation colonne 3"); panel.add(button); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { boolean selected = t.isColumnSelected(2); t.setColumnSelected(2, ! selected); } }); frame.getContentPane().add(panel); frame.pack(); frame.setVisible(true); } private class HeaderValue { /** text */ private String text = null; /** selected */ private Boolean selected = Boolean.FALSE; public HeaderValue(String text) { this(text, Boolean.FALSE); } public HeaderValue(String text, Boolean selected) { this.text = text; this.selected = selected; } } }
Partager