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
| import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class JTableFilterExemple {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] cols = {"Nom","Prénom"};
Object[][] data = {
{"Natalie", "Portman"},
{"Clovis", "Cornillac"},
{"Vincent", "Cassel"},
{"Jason", "Statham"},
{"Scarlett", "Johansson"},
{"Will", "Smith"},
{"Reese", "Witherspoon"},
{"Charlize", "Theron"},
{"Robert", "De Niro"},
{"Cécile", "de France"},
{"Alec", "Guinness"},
{"Audrey", "Hepburn"},
{"Cary", "Grant"},
{"Sylvie", "Dorléac"},
{"Sean", "Connery"},
{"Isabelle", "Adjani"},
};
JTable table = new JTable(data,cols);
JPanel filterPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx=GridBagConstraints.RELATIVE;
gbc.gridy=0;
gbc.insets = new Insets(5,5,5,5);
filterPanel.add(new JLabel("Filtre : "),gbc);
JTextField filterField = new JTextField("");
gbc.fill=GridBagConstraints.BOTH;
gbc.weightx=1;
gbc.weighty=1;
filterPanel.add(filterField,gbc);
JPanel panel = new JPanel(new BorderLayout());
frame.add(panel);
JScrollPane scrollpane = new JScrollPane(table);
scrollpane.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));
panel.add(scrollpane);
panel.add(filterPanel, BorderLayout.NORTH);
// filtres
table.setAutoCreateRowSorter(true);
TableRowSorter<TableModel> rowsorter = (TableRowSorter<TableModel>) table.getRowSorter();
filterField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
setFilter();
}
@Override
public void insertUpdate(DocumentEvent e) {
setFilter();
}
@Override
public void changedUpdate(DocumentEvent e) {
setFilter();
}
private void setFilter() {
String filter = filterField.getText();
if( filter.isBlank()) { // si texte vide ou seulement des espaces
rowsorter.setRowFilter(null); // suppression du filtre
}
else {
setFilter(filter.trim().split("\\s+"));
}
}
private void setFilter(String[] filters) {
rowsorter.setRowFilter(new RowFilter<TableModel, Integer>() {
@Override
public boolean include(Entry<? extends TableModel, ? extends Integer> entry) {
for(String filter : filters) {
if ( matches(filter.toLowerCase(), entry) ) {
return true;
}
}
return false;
}
private boolean matches(String filter, Entry<? extends TableModel, ? extends Integer> entry) {
for(int i=0; i<entry.getValueCount(); i++) {
if ( matches(entry.getStringValue(i),filter) ) {
return true;
}
}
return false;
}
private boolean matches(String stringValue, String filter) {
if ( stringValue!=null && stringValue.toLowerCase().contains(filter) ) {
return true;
}
return false;
}
});
}
});
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
} |
Partager