Seit Java 1.6 lassen sich Tabellen auf Klick sortieren und filtern. v.1.6
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:
- 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.
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());
}
}
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.