Seit Java 1.6 lassen sich Tabellen auf Klick sortieren und filtern. v.1.6

Die Klassen TableRowSorter und RowFilter erlauben seit Java 1.6 ein Sortieren einer Tabelle und das Filtern nach Inhalten. Siehe auch den Artikel: Tabellen durchsuchen.

Die Beispielklasse ist abgeleitet von JPanel, um die Tabelle, eingebettet in JScrollPane, auf einfache Weise in den aufnehmenden JFrame laden zu können. So ist die Darstellung des Tabellenkopfes gewährleistet, sodass durch Anklicken der entsprechenden Spalte eine Sortierung durchgeführt werden kann.
Zunächst wird der Inhalt der Tabelle in ein Objekt der Klasse DefaultTableModel geladen. Dem Modelkonstruktor werden hierbei zwei Arrays übergeben: ein zweidimensionales für den Inhalt und ein eindimensionales für die Spaltenüberschriften des Kopfes. Das Model wird bei der Initialisierung der JTable als Parameter übergeben.
Die folgende Zeile zeichnet ein Gitter zur Trennung von Zeilen und Spalten. Hierbei ist zu beachten, dass die Standardfarbe des Gitters weiß ist, sodass die Linien bei einem weißen Hintergrund nicht zu sehen sind. Aus diesem Grund muss die Gitterfarbe geändert werden. Aus ästhetischen Gründen kann auch der Kopf der Tabelle eingefärbt werden.
Die Möglichkeit zur Sortierung der Tabelle durch Anklicken eines Spaltenkopfes kann auf zweierlei Weise eingerichtet werden:

  1. Die hier gezeigte Variante ruft eine selbst erstellte Methode enableSorting(JTable table) auf, die in der Folge kommentiert wird.
  2. Die zweite Variante besteht darin, auf dem Tabellenobjekt die Methode JTable.setAutoCreateRowSorter(boolean enable) aufzurufen.

In der Methode enableSorting(JTable table) wird zunächst das Model der Tabelle ermittelt und eine Instanz des TableRowSorter<TableModel> gebildet. Sie ermöglicht sowohl die Sortierung des Models(!), als auch dessen Filterung nach Inhalten. Die Sortierung erfolgt hierbei so, dass der Inhalt einer Zeile als Einheit gesehen und umsortiert wird.
Der Tabelle wird der TableRowSorter und diesem das Tabellenmodell übergeben.
Auskommentiert ist zum Schluss eine Zeile, in der ein Filter eingebunden wird. Die Klasse RowFilter deklariert hierzu einige statische Methoden, die es ermöglichen, unterschiedliche Filterweisen vorzunehmen. So kann nach Zahlen, Datumsangaben, etc. gefiltert werden. Hier wird ein regulärer Ausdruck verwendet, der die Einträge nach einer Silbe filtert.

package swing.tabelle;

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class TabelleSortieren extends JPanel {
    
    public TabelleSortieren() {
        String[] colNames = new String[] { "Null", "Eins", "Zwei" };
        String[][] data = { new String[] { "Katze", "Wurm", "Floh" },
                new String[] { "Helga", "Doris", "Berta" },
                new String[] { "Pizza", "Kekse", "Labskaus" } };
        DefaultTableModel model = new DefaultTableModel(data, colNames);
        JTable table = new JTable(model);
        table.setShowGrid(true);
        // default Gitterfarbe: weiß!
        table.setGridColor(Color.gray);
        JTableHeader header = table.getTableHeader();
        header.setBackground(Color.yellow);
        this.add(new JScrollPane(table));
        enableSorting(table);
    }

    public void enableSorting(JTable table) {
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        if (model == null)
            return;

            TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
            table.setRowSorter(sorter);
            sorter.setModel(model);
            // Filter zeigt nur Reihen in denen 'kau' enthalten ist
            // zur Aktivierung entkommentieren
            //sorter.setRowFilter(RowFilter.regexFilter(".*kau.*"));
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Tabelle sortieren");
        frame.add(new TabelleSortieren());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}