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:


 
Partagez cet article

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *