Seit Java 1.6 lassen sich Tabellen auf Klick sortieren und filtern. v.1.6
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:
- Die hier gezeigte Variante ruft eine selbst erstellte Methode enableSorting(JTable table) auf, die in der Folge kommentiert wird.
- 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);
}
}