Die im Rahmen unserer Diplomarbeit entstehende Anwendung verfügt unter anderem auch über ein TabbedPane, in welchem mehrere Panels mit Informationen angezeigt werden. TabbedPane, das ist in etwa die gleiche Art wie Tabs in einem Browser.

Erste Usability-Versuche zeigten, das gewisse Aktionen wie “Alle Tabs schließen” aus Organisationsgründen fehlen, also flugs ran.. wären da nicht ein paar Probleme.

Einerseits verfügt leider das Standard-TabbedPane nicht über einen “Schließen”-Knopf, so das man entweder zu obskuren Hacks oder auf die TabbedComponent-Erweiterung aus dem JDK6 angewiesen ist. Kurze Erläuterung: Damit kann man quasi den Tab-Header komplett selber zeichnen, also auch inkl. eigener Panels, Buttons, usw.

Andererseits gibt es natürlich kein Tab-Management. Es gibt kein “Aktuellen Tab schließen”, kein “Alle Tabs schließen” oder auch “Nächsten Tab wählen”. Weder in einer Menubar noch als Popupmenu via Kontextmenu auf den Tab-Header.

Also, selber bauen! Es gibt natürlich eine Reihe von Möglichkeiten, aber das beste Rezept erscheint mir eine Mischung aus:

  • Die TabbedPane-Komponente, die Änderungen mittels firePropertyChange weitergibt, vorgeschlagene Kandidaten sind: openTabItem(null, title), closeTabItem(title, null) und selectedTabItem(null, title). Damit lassen sich alle o.g. Aktionen auf das Menu spiegeln.
  • Die Menubar, welche die Liste der Einträge und die Aktionen bereitstellt. Die Aktionen werden durch eine externe Komponente (nennen wir sie mal Controller) ausgeführt.
  • Spezieller TabChangeListener, welcher die o.g. Aktionen abfängt und die Änderungen an die Menubar weitergibt.
  • Ein Popupmenu (für das Kontextmenu) schickt die Commands direkt an o.g. Controller.

Die Lösung ist derzeit in die Applikation eingefügt, aber ich plane, das ganze als autonomes Package demnächst zu extrahieren.