Tutorial : Membuat Filter Table dengan SwingX

Sebelumnya saya telah membahas tentang membuat filter untuk JList atau JXList di artikel Tutorial : Membuat Filter List lebih mudah dengan SwingX. Kali ini saya akan membahas Filter untuk JTable atau JXTable. Sekedar untuk mengingatkan bahwa filter disini digunakan sebagai pencarian, dan proses yang berlaku adalah menyaring data yang ditampilkan di JTable atau JXTable berdasarkan kata yang dicari. Fasilitas ini sangat berguna untuk mempercepat pencarian, biasanya pencarian dilakukan langsung ke database, hal ini akan menghabiskan banyak memory. Pencarian filtering ini dilakukan dengan menyaring data yang ditampilkan di komponen JTable atau JXTable. Untuk contoh screen shoot dapat kalian lihat pada gambar dibawah ini.


Walaupun fasilitas ini mempunyai kelemahan, salah satunya adalah jika ada penambahan data ke database dari user dan komputer lain, data yang baru tidak akan ditampilkan. Namun, dengan menambahkan fasilitas ini kalian dapat mempermudah dan mempercepat dalam hal pencarian data. Selain itu untuk hal seperti ini, kalian dapat merubah atau menambahkan algoritma lain, misalkan setiap beberapa menit sekali melakukan pengecekan ke database dan menambahkan data baru di record terakhir. Untuk source code lengkapnya silahkan kalian lihat dan pelajari dibawah ini.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import org.jdesktop.swingx.JXTable;

/**
 *
 * @author Muhamad Wibawa
 */
public class FilterTableExample extends JFrame {

    private JXTable table = new JXTable();
    private static String[] peopleName = new String[]{"Adam Barclay",
        "Aleksandras Novikovas", "Bill Snyder", "Bryan Young",
        "Dan Leuck", "Daniel Lewis", "Daniel Olivera",
        "David Bolsover", "David Hall", "Diego Gil",
        "Dirk Hillbrecht", "Doug Berkland",
        "Erik Vickroy", "Fred Lavigne",
        "Gilles Philippart", "Haris Peco",
        "Jan Bosenberg", "James Morgan",
        "Jeanette Winzenburg", "Mario Cesar",
        "Mark Davidson", "Mark Fortner", "Mark Thornton",
        "Matt Nathan", "Michael Bush", "Michael Swindle",
        "Neil Weber", "Nicola Ken Barozzi", "Noel Grandin",
        "Oleg Minukhin", "Patrick Gotthardt", "Patrick Wright",
        "Pierre Le Lannic", "Ray Turnbull", "Ricardo Lopes",
        "Richard Bair", "Richard Osbaldeston", "Robert Eden", "Robert Stone",
        "Ronald Tetsuo Miura", "Salvan Haas", "Scott Delap",
        "Sean McNamara", "Simon Morris", "Shai Almog",
        "Thomas Bierhance", "Wade Chandler", "Waldemar Klaczynski",
        "Walter Wang", "Xavier Hanin", "Yannick Menager"};
    private JTextField fieldSearch = new JTextField();
    private TableRowSorter<TableModel> sorter;

    public FilterTableExample() {
        construct();
    }

    private void construct() {

        fieldSearch.getDocument().addDocumentListener(new DocumentListener() {

            public void insertUpdate(DocumentEvent e) {
                filter();
            }

            public void removeUpdate(DocumentEvent e) {
                filter();
            }

            public void changedUpdate(DocumentEvent e) {
                filter();
            }
        });

        fillTableData();

        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        sorter = new TableRowSorter<TableModel>(table.getModel());
        table.setRowSorter(sorter);

        JScrollPane scPane = new JScrollPane();
        scPane.setViewportView(table);

        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.setBorder(new EmptyBorder(10, 10, 10, 10));
        panel.add(fieldSearch, BorderLayout.NORTH);
        panel.add(scPane, BorderLayout.CENTER);

        this.setTitle("Filter Table Examples");
        this.setPreferredSize(new Dimension(500, 500));
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(panel, BorderLayout.CENTER);

    }

    public void filter() {
        String text = fieldSearch.getText();
        if (text.length() == 0) {
            sorter.setRowFilter(null);
        } else {
            sorter.setRowFilter(RowFilter.regexFilter(Pattern.compile("(?i).*" + text + ".*",
                    Pattern.CASE_INSENSITIVE | Pattern.DOTALL).toString()));
        }
    }

    private void fillTableData() {
        DefaultTableModel model = new DefaultTableModel();

        model.addColumn("First Name");
        model.addColumn("Last Name");
        
        
        for (String p : peopleName) {

            StringTokenizer token = new StringTokenizer(p, " ");

            String first = token.nextToken();
            String last = token.nextToken();

            model.addRow(new Object[]{first, last});
        }
        
        
        table.setModel(model);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                JFrame test = new FilterTableExample();
                test.pack();
                test.setLocationRelativeTo(null);
                test.setVisible(true);
            }
        });
    }
}

Sekian penjelasan singkat cara membuat filter table dengan SwingX, semoga bermanfaat, jika kalian masih bingung jangan ragu-ragu silahkan ajukan pertanyaan.