Salut à tous
quelqu'un me dit quel est le bénfit de Filter table(RowFilter)?et quel est son utilisation?
Salut à tous
quelqu'un me dit quel est le bénfit de Filter table(RowFilter)?et quel est son utilisation?
Salut,
Si tu parles de la classe javax.swing.RowFilter, elle sert à filtrer les JTable, soit à afficher uniquement les lignes qui correspondent à une formule sur les valeurs des colonnes, sans avoir à changer ce qui se trouve dans le modèle (enlever des lignes). Elle marche de concert avec la classe javax.swing.table.TableRowSorter, qui sert à définir les tris sur les colonnes : il faut absolument que la table en ait un.
Ci-après un exemple démo, avec trois filtres (un texte/regex, une combo, un slider) combinés.
- Si tu tapes des lettres dans le champ texte, on ne verra que les voitures dont le nom contient ce que tu as tapé
- si tu choisis une couleur dans la combo, tu ne verras que les voitures de cette couleur
- le slider permet de choisir le prix minimal qu'on veut pour les voitures affichées
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 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.regex.Pattern; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.RowFilter; import javax.swing.RowFilter.ComparisonType; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableRowSorter; public class TableRowFilterDemo { public static void main(String[] args) { List<Car> cars = Arrays.asList( new Car("McLaren 720S", Paint.GRAY, 6_500_000), new Car("Ferrari 488 GTB", Paint.YELLOW, 5_500_000), new Car("Ford GT", Paint.RED, 5_500_000), new Car("Lamborghini Huracán", Paint.YELLOW, 5_500_000), new Car("Lamborghini Aventador", Paint.RED, 4_500_000), new Car("Noble M600", Paint.SILVER, 3_500_000), new Car("Gumpert Apollo", Paint.ORANGE, 3_500_000), new Car("Tushek Renovatio T500", Paint.WHITE, 3_500_000), new Car("Spyker C8 Aileron", Paint.WHITE, 2_500_000), new Car("Vencer Sarthe", Paint.SILVER, 2_500_000) ); JTable table = createTable(cars); JFrame frame = new JFrame("Démo filtres"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(new BorderLayout()); panel.add(new JScrollPane(table)); JTextField nameFilter = new JTextField(20); List<Paint> colorItems = new ArrayList<>(); colorItems.add(null); colorItems.addAll(Arrays.asList(Paint.values())); JComboBox<Paint> colorFilter = new JComboBox<>(colorItems.toArray(new Paint[colorItems.size()])); colorFilter.setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if ( value instanceof Paint ) { Paint paint = (Paint) value; DefaultListCellRenderer renderer = (DefaultListCellRenderer) super.getListCellRendererComponent(list, paint.getLabel(), index, isSelected, cellHasFocus); renderer.setIcon(paint.getIcon()); return renderer; } else { return super.getListCellRendererComponent(list, "Toutes", index, isSelected, cellHasFocus); } } }); JSlider priceFilter = new JSlider(1_000_000,10_000_000); JPanel filterPanel = new JPanel(new GridBagLayout()); filterPanel.add(new JLabel("Nom :")); filterPanel.add(nameFilter); filterPanel.add(new JLabel("Couleur :")); filterPanel.add(colorFilter); filterPanel.add(new JLabel("Prix :")); filterPanel.add(priceFilter); JLabel priceFilterLabel = new JLabel(); priceFilter.addChangeListener(e->priceFilterLabel.setText(priceFilter.getValue()+ " ")); priceFilter.setValue(1_000_000); filterPanel.add(priceFilterLabel); Insets insets = new Insets(5,3,10,3); GridBagLayout gbl = (GridBagLayout)filterPanel.getLayout(); for(Component comp : filterPanel.getComponents() ) { GridBagConstraints gbc = gbl.getConstraints(comp); gbc.insets=insets; gbl.setConstraints(comp, gbc); } panel.setBorder(BorderFactory.createEmptyBorder(5, 10, 10, 10)); panel.add(filterPanel, BorderLayout.NORTH); frame.add(panel); // filtrage nameFilter.getDocument().addDocumentListener(new DocumentListener() { @Override public void removeUpdate(DocumentEvent e) { updateFilter(table, nameFilter, colorFilter, priceFilter); } @Override public void insertUpdate(DocumentEvent e) { updateFilter(table, nameFilter, colorFilter, priceFilter); } @Override public void changedUpdate(DocumentEvent e) { updateFilter(table, nameFilter, colorFilter, priceFilter); } }); colorFilter.addActionListener(e->updateFilter(table, nameFilter, colorFilter, priceFilter)); priceFilter.addChangeListener(e->updateFilter(table, nameFilter, colorFilter, priceFilter)); frame.setSize(800,300); frame.setLocationRelativeTo(null); frame.setVisible(true); } private static void updateFilter(JTable table, JTextField nameFilter, JComboBox<Paint> colorFilter, JSlider priceFilter) { List<RowFilter<CarTableModel, Integer>> filters = new ArrayList<>(); filters.add( RowFilter.numberFilter(ComparisonType.AFTER, priceFilter.getValue(), CarTableModel.PRICE) ); if ( !nameFilter.getText().trim().isEmpty() ) { filters.add( RowFilter.regexFilter("(?i)^.*?"+Pattern.quote(nameFilter.getText())+".*$", CarTableModel.NAME) ); } if ( colorFilter.getSelectedItem()!=null ) { filters.add( new RowFilter<CarTableModel, Integer>() { @Override public boolean include(Entry<? extends CarTableModel, ? extends Integer > entry) { Paint paint = (Paint) entry.getModel().getValueAt(entry.getIdentifier(), CarTableModel.PAINT); return colorFilter.getSelectedItem()==paint; } }); } TableRowSorter<CarTableModel> rowSorter = (TableRowSorter<CarTableModel>) table.getRowSorter(); rowSorter.setRowFilter(RowFilter.andFilter(filters)); } private static JTable createTable(List<Car> cars) { JTable table = new JTable(); CarTableModel model = new CarTableModel(cars); table.setModel(model); table.setRowHeight(table.getFont().getSize()*2); table.setDefaultRenderer(Paint.class, new ColorCellRenderer()); table.setFillsViewportHeight(true); TableRowSorter<CarTableModel> sorter = new TableRowSorter<CarTableModel>(model); table.setRowSorter(sorter); return table; } private static class CarTableModel extends AbstractTableModel { public static final int NAME = 0; public static final int PAINT = 1; public static final int PRICE = 2; private final List<Car> cars = new ArrayList<>(); public CarTableModel(Collection<Car> cars) { if ( cars!=null ) { this.cars.addAll(cars); } } @Override public int getColumnCount() { return 3; } @Override public String getColumnName(int columnIndex) { switch(columnIndex) { case NAME: return "Nom"; case PAINT: return "Couleur"; case PRICE: return "Prix"; default: throw new IllegalStateException(); } } @Override public Object getValueAt(int rowIndex, int columnIndex) { Car car = cars.get(rowIndex); switch(columnIndex) { case NAME: return car.getName(); case PAINT: return car.getPaint(); case PRICE: return car.getPrice(); default: throw new IllegalStateException(); } } @Override public Class<?> getColumnClass(int columnIndex) { switch(columnIndex) { case NAME: return String.class; case PAINT: return Paint.class; case PRICE: return Long.class; default: throw new IllegalStateException(); } } @Override public int getRowCount() { return cars.size(); } } private static class Car { private final String name; private final Paint paint; private long price; public Car(String name, Paint paint, long price) { this.name=name; this.paint=paint; this.price=price; } public String getName() { return name; } public Paint getPaint() { return paint; } public long getPrice() { return price; } public void setPrice(long price) { this.price = price; } } public enum Paint { RED("Rouge","DC143C"), YELLOW("Jaune", "FFDD33"), GREEN("Vert", "23D16A"), BLUE("Bleu", "1E90FF"), GRAY("Acier", "B0C4DE"), SILVER("Argent", "DEE7E2"), ORANGE("Orange", "E89E32"), WHITE("Blanc", "FFFFFF"), BLACK("Noir", "161615"), ; private final String label; private final Icon icon; private Paint(String label, String colorCode) { this.label=label; this.icon=createIcon(colorCode); } public String getLabel() { return label; } public Icon getIcon() { return icon; } private static Icon createIcon(String colorCode) { BufferedImage image = new BufferedImage(24, 24, BufferedImage.TYPE_INT_ARGB); Graphics2D g = image.createGraphics(); g.translate(3, 3); g.setColor(Color.BLACK); g.fillRect(0, 0, 18, 18); g.setColor(Color.decode("#"+colorCode)); g.fillRect(1, 1, 16, 16); g.dispose(); return new ImageIcon(image); } } private static class ColorCellRenderer extends DefaultTableCellRenderer { @Override protected void setValue(Object value) { if ( value instanceof Paint ) { Paint paint = (Paint) value; setIcon(paint.getIcon()); super.setValue(paint.getLabel()); } else { setIcon(null); super.setValue(null); } } } }
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager