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 zeigt ein JPanel mit Tabelle, eingebettet in ein JScrollPane. So ist die Darstellung des Tabellenkopfes gewährleistet und durch Anklicken der entsprechenden Spalte kann eine Sortierung durchgeführt werden.
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.

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class TabelleSortieren {
    
    public TabelleSortieren() {
        init();
    }
    
    private void init() {
        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);
        JPanel panel = new JPanel();
        panel.add(new JScrollPane(table));
        enableSorting(table);
        JFrame frame = new JFrame("Tabelle sortieren");
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    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);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new TabelleSortieren());
    }
}

Fenster mit Dateibaum