Recherche dynamique dans un JTable
JTable est un composant Swing flexible, est une sous-classe de la classe JComponent et elle peut être utilisée pour créer une table avec des informations affichées dans plusieurs lignes et colonnes. Nous pouvons rechercher des mots dynamiquement dans un JTable en utilisant RowFilter pour filtrer les résultats de la recherche. Voici un exemple utilisant RowFilter et DocumentListener. Lorsque l’utilisateur tape, les lignes sont filtrées dynamiquement.
Si vous ne souhaiter pas le filtrage dynamique, vous pouvez simplement vous utiliser un bouton, ou vous pouvez ajouter un ActionListener au JTextField, donc lorsque vous appuyez sur Entrée, le filtre sera traité.
Exemple:
import java.awt.BorderLayout; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; public class SearchInJtable extends JPanel { //Header de JTable String[] columns = new String[] { "Id", "Nom", "Adresse", "Taux horaire", "A temps partiel" }; //données pour JTable dans un tableau 2D Object[][] data = new Object[][] { {1, "Thomas", "74 rue des Chaligny", 20.0, true }, {2, "Jean", "124 rue du Président Roosevelt", 50.0, false }, {3, "Yohan", "50 Place Charles de Gaulle", 30.0, true }, {4, "Emily", "57 place de Miremont", 60.0, false }, {5, "Alex", "98 rue Pierre De Coubertin", 10.0, false }, }; //crée un JTable avec des données JTable table = new JTable(data, columns); TableRowSorter<TableModel> sort = new TableRowSorter<>(table.getModel()); JTextField textField = new JTextField(); public SearchInJtable() { //définir la largeur de la 3éme colonne sur 200 pixels TableColumnModel columnModel = table.getColumnModel(); columnModel.getColumn(2).setPreferredWidth(200); table.setRowSorter(sort); JPanel p = new JPanel(new BorderLayout()); p.add(new JLabel("Chercher un mot:"), BorderLayout.WEST); p.add(textField, BorderLayout.CENTER); setLayout(new BorderLayout()); add(p, BorderLayout.SOUTH); add(new JScrollPane(table), BorderLayout.CENTER); textField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { String str = textField.getText(); if (str.trim().length() == 0) { sort.setRowFilter(null); } else { //(?i) recherche insensible à la casse sort.setRowFilter(RowFilter.regexFilter("(?i)" + str)); } } @Override public void removeUpdate(DocumentEvent e) { String str = textField.getText(); if (str.trim().length() == 0) { sort.setRowFilter(null); } else { sort.setRowFilter(RowFilter.regexFilter("(?i)" + str)); } } @Override public void changedUpdate(DocumentEvent e) {} }); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run() { JFrame f = new JFrame("Chercher dans JTable"); f.add(new SearchInJtable()); f.setSize(500, 180); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLocationRelativeTo(null); f.setVisible(true); } }); } }
Sortie: