Mittlerweile wird oft erwartet, dass Applikationen Tabellenkomponenten enthalten, damit die Tabellenansichten per Mausklick in die Kopfzeile der Tabelle sortiert werden können. Es mag überraschen, dass das Swing-Toolkit keine Funktionalität enthält, mit der dies leicht erzielt werden kann. Am sonderbarsten daran ist, dass Sun das Sortieren von Tabellen in Aussicht gestellt hat. Suns JavaDocs verweisen auf die umfangreichen Online-Sun-Java-Tutorials. Wenn man den JTable-Verknüpfungen folgt, kommt man zu einem Tutorial, dass schließlich unter zahlreichen [nicht veröffentlichten] Kommentaren im Text die TableSorter Klasse erwähnt, die man unter http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/TableSorter.java findet.
Nun ist der TableSorter ein Tapezier-Modell und kann ein vorhandenes TableModel einpacken und sämtliche Sortierfunktionen hinzufügen, ohne das zugrunde liegende TableModel zu verändern. Er speichert nicht die Inhalte der Tabelle; er tut nur das absolute Minimum, um herauszubekommen, wie die Inhalte und Map-Aufrufe bis zum eingepackten Modell sortiert werden. In ToDoTasks gibt es das TasksModel, eine einfache Ansicht der Tasks-Klasse ohne Sortiermöglichkeit. Sobald das GUI erzeugt ist, wird in der TasksFrame-Klasse der Controller aufgerufen, um das TasksModel zu erhalten, das man dann als das JTable-Modell konfiguriert.
Um den TableSorter einzubinden, muss zuerst das TaskModel in einen TableSorter gepackt und dann der Sorter als das JTable-Modell konfiguriert werden, etwa folgendermaßen:
Eine Sache ist noch zu erledigen: dem Sorter ist die Kopfzeile von JTables Tabelle zu übergeben, so dass er sie durchgehen und Mouse-Event-Listener einfügen kann, damit über die Kopfzeilen das Sortieren ausgelöst werden kann:
Das war’s. Jetzt hat man einen JTable, bei dem man auf die Kopfzeile klicken kann, um zwischen keiner Sortierung, aufsteigender und absteigender Reihenfolge zu wechseln. Die Tabelle unterstützt auch eine sekundäre Spalte zum Sortieren, indem man Steuerung drückt und auf die Kopfzeilen klickt. So einfach war das, und man fragt sich, warum TableSorter kein offizieller Bestandteil von Swing ist.
Tipp: Schnellere Erstellung von Prototypen
Mit der Handhabung von Enumerationen kann Zeit verschwendet werden, wenn man sie in einer Tabelle präsentiert und sie von einem enum-Wert in einen String und umgekehrt übersetzt. In ToDoTasks wird die Priorität des Tasks als Java-5.0-enum in Priority.java dargestellt, und zwar folgendermaßen:
Um dies nun schnell in der Tabelle mit Namen erscheinen zu lassen, kann man einen angepassten Cell-Renderer für die Tabelle schreiben, der den enum-Wert übersetzt. Weil enums jetzt richtige Objekte sind, kann man dem JTable vorgeben, seine Standardeinstellungen zu verwenden, um den Wert auszugeben. Was dann angezeigt wird, ist nicht der numerische Wert, sondern der Name des enum-Werts.
Um das Editieren des Werts zu ermöglichen, könnte man wiederum einen angepassten CellEditor schreiben, der das übernimmt. Man muss aber nur 3 Zeilen Code schreiben, um den Editor zu einer Dropdown-Liste mit allen enum-Werten zu machen. Um alle Werte eines enum zu erhalten, kann man seine values-Methode verwenden. Die gibt eine Liste in der Reihenfolge zurück, in der die enum-Werte deklariert wurden. Sobald eine JTable in TasksFrame erzeugt ist, kann ein DefaultCellEditor mit einer JComboBox erzeugt werden.
Die JComboBox wird mit der Liste der Werte von Priority initialisiert. Um den CellEditor bedienungsfreundlicher zu machen, wird er so eingestellt, dass er zwei Klicks braucht, um mit dem Bearbeiten der Zelle zu beginnen:
Wenn man ihn bei einem Klick belassen hätte, wäre es sehr schwierig, mit dieser Zelle eine Zeile auszuwählen, denn sie würde sofort ein Combobox-Menü zeigen, um sie zu verändern. In einem Letzten Schritt muss der Tabelle vorgegeben werden, dass sie, sobald sie einen Priority-Wert in einer Zelle vorfindet, den neuen Editor verwenden soll:
Jetzt ist also ein Combobox-Editor vorhanden, der die Namen der enums anzeigt, wie sie im Code erscheinen; damit lässt sich beim Erstellen von Prototypen viel Zeit sparen.
Neueste Kommentare
Noch keine Kommentare zu Datenpersistenz bei Java-Applikationen
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.