Für ernsthafte grafische Oberflächen mit Swing sind die Standardkomponenten der Java SE etwas mau. Wichtige Komponenten wie ein Datumsauswahldialog fehlen, zum Teil sind die angebotenen Komponenten nicht leistungsfähig genug. So kann beispielsweise die Swing-Textkomponente zwar einfaches HTML darstellen, scheitert aber an komplexeren Dokumenten mit CSS. Da die Java Foundation Classes in den letzten Jahren sehr stabil geblieben sind – es gab keine großen Änderungen oder nennenswerte neue Komponenten –, bleibt Entwicklern nichts anderes übrig, als entweder
- die benötigten Swing-Komponenten selbst zu entwickeln oder
- sich im Open-Source-Umfeld umzuschauen bzw.
- eine kommerzielle Swing-Komponentenbibliothek einzukaufen.
Wie üblich ist die Eigenentwicklung immer nur die letzte Option. Im Laufe der letzten Jahre haben sich einige sehr gute quelloffene Swing-Zusätze etabliert. Hervorzuheben ist SwingX, ein Projekt, von dem lange Zeit gedacht wurde, dass die Komponenten in das javax.swing-Paket aufgenommen würden. Das ist aber bisher nicht passiert, nur eine Komponente hat es – wen auch abgewandelt – in die Standardbibliothek geschafft.
Hinweis: Aktiv wird SwingX nicht mehr weiterentwickelt.
Im Angebot: Erweiterte und neue Swing-Komponenten
Die SwingX-Bibliothek erweitert Swing auf zwei Arten:
- Einige SwingX-Komponenten erweitern die Standard-Swing-Komponenten und fügen Funktionalität hinzu. So ist JXFrame eine Unterklasse von JFrame und kann zum Beispiel eine Statuszeile haben. Oder JXTable ist eine Unterklasse von JTable mit zusätzlicher Suchfunktionalität und dem Vorteil, dass sich Spalten automatisch ein-/ausblenden lassen.
- SwingX definiert ganz neue Swing-Komponenten, etwa eine Mischung aus Tabelle und Baum (JXTreeTable), ausfaltbare Container oder einen Login-Dialog.
Um einen ersten Überblick über SwingX zu bekommen, lohnt es sich, einen Blick auf das SwingX-Demo zu werfen. Auf der SwingX-Homepage http://swingx.java.net/ wird auf die Web-Startapplikation verlinkt (http://swinglabs-demos.java.net/demos/swingxset6/swingxset.jnlp).
Überblick über erweiterte Standard-Swing-Klassen
SwingX nimmt einige Klassen als Basisklassen und fügt Funktionalität hinzu. Die Standardkomponenten lassen sich problemlos gegen die neuen Klassen austauschen.
SwingX-Klasse | Swing-Basisklasse | Aufgabe |
JXButton | JButton | Schaltfläche mit Unterstützung für Painter |
JXLabel | JLabel | Beschriftung mit Unterstützung für Painter |
JXTable | JTable | stark erweiterte Tabelle mit Suche, Sortierung, Filterung, … |
JXList | JList | stark erweiterte Liste mit Suche, Sortierung, Filterung, … |
JXTree | JTree | stark erweiterter Baum mit Suche, Filterung, … |
JXFrame | JFrame | Fenster mit optionaler Statuszeile, Warte-zustand, … |
JXDialog | JDialog | Vereinfacht den Aufbau von Dialogen. |
JXPanel | JPanel | Panel mit Transparenz und Painter |
JXEditorPane | JEditorPane | verbesserte Editor-Funktionalität, Undo/Redo und Suche |
JXComboBox | JComboBox | Verbessert den Edit-Modus beim Einsatz in einer Tabelle. |
JXFormattedTextField | JFormattedTextField | Unterstützt Prompts und Buddies in formatierten Textzeilen. |
JXTextArea | JTextArea | Unterstützt Prompts und Buddies in Text-bereichen. |
JXTextField | JTextField | Unterstützt Prompts und Buddies in Text-zeilen. |
JXRootPanel | JRootPanel | Wurzelkomponente mit Symbolleiste und Statuszeile |
Erweiterte Standard-Swing-Klassen
Die Klassen JXTable, JXList, JXTreeTable sind sehr leistungsfähig und daher mit einem kleinen Satz kaum zu beschreiben. Die API-Dokumentation gibt mehr Informationen. Wichtig sind dabei Klassen aus dem Paket org.jdesktop.swingx.decorator, die für JXTable, JXTreeTable, JXTree und JXList Sortierung, Filterung und Hervorhebung unterstützen.
In den Zellen tauchen zudem die Begriffe Painter, Prompt und Buddy auf:
- Ein Painter ist ein Objekt, das an die SwingX-Komponente gesetzt wird. Zum Zeichnen greift die SwingX-Klasse auf das externe Zeichenobjekt zurück. Der Vorteil ist, dass so keine Unterklassen nötig sind, etwa von JButton oder JLabel, nur wenn in den Zeichenprozess eingegriffen werden soll.
- Prompts und Buddies zeigen bei JXTextField, JXFormattedTextField und JXTextArea Eingabehinweise oder Fehler.
Neue Swing-Klassen
Zusätzlich zu den Erweiterungen der Standard-Swing-Komponenten bietet SwingX weitere Komponenten. Manche sind dringend nötig, etwa zur Auswahl eines Datums, einige sind sehr speziell, etwa zum Zeichnen eines 2D-Graphen.
SwingX-Klasse | Swing-Basisklasse | Aufgabe |
JXDatePicker | JComponent | Datumseingabe im Textfeld mit Popup-Menü |
JXHyperlink | JButton | Hyperlink |
JXBusyLabel | JLabel | Animation für Ladeprozesse |
JXTreeTable | JXTable | Verschmilzt Tabelle und Baum. |
JXStatusBar | JComponent | Statuszeile, in der Regel unten am Fenster |
JXErrorPane | JComponent | Darstellung von Fehlermeldungen |
JXMultiThumbSlider | JComponent | Slider mit zwei Knöpfen |
JXMonthView | JComponent | Zeigt Monatskalender und erlaubt Monats-auswahl. |
JXSearchField | JXTextField | Textfeld mit kleinem Such-Icon |
JXRadioGroup | JPanel | Vereinfacht die ButtonGroup. |
JXMultiSplitPane | JPanel | geschachtelte Split-Panels |
JXCollapsiblePane | JXPanel | animierte ausfaltbare Panels |
JXTaskPane | JXPanel | Titel mit Icon zum Ausfalten der Container-elemente |
JXTaskPaneContainer | JXPanel | Container für mehrere JXTaskPanes |
JXTipOfTheDay | JXPanel | Gibt den „Tipp des Tages“ aus. |
JXTitledPanel | JXPanel | Panel mit Überschrift |
JXTitledSeparator | JXPanel | Trennlinie mit Text |
JXImageView | JXPanel | Zeigt ein Bild, ein neues kommt mit Drag & Drop. |
JXColorSelectionButton | JButton | Zeigt bei Aktivierung einen Farbauswahldialog. |
JXGradientChooser | JXPanel | Panel zum Aufbau eines Farbverlaufs (-Gradient) |
JXGraph | JXPanel | Zeichnet 2D-Graphen. |
Neue Klassen, die SwingX bietet
Zur Suche gehören noch ein paar andere Komponenten, die nicht aufgeführt sind. Für die JXTable gibt es weiterhin JXTableHeader, was eine Spezialisierung von JTableHeader ist.
Weitere SwingX-Klassen
Des Weiteren gibt es ein paar neue Layoutmanager, etwa HorizontalLayout, VerticalLayout oder StackLayout (setzt alle Komponenten aufeinander). SwingX unterstützt ebenfalls die Tastaturvervollständigung bei Textfeldern und der Combo-Box. Beispiele finden sich im Paket org.jdesktop.swingx.autocomplete.
SwingX-Installation
Wer SwingX einsetzen möchte, der lädt von http://java.net/downloads/swingx/releases/ das Java-Archiv swingx-all-1.6.4.jar (etwa 1,4 MiB) herunter und bindet es in den Klassenpfad ein. Auf den Seiten sind auch die Quellen und die Java-API-Dokumentation verlinkt. Nach dem Einbinden stehen die neuen Klassen unter dem Paket org.jdesktop.swingx zur Verfügung.
Es ist auch möglich, die SwingX-Komponenten mit Matisse dem GUI-Builder von Netbeans zu verwenden und sich so GUIs zusammenzuklicken.
…ist zwar nicht meine bevorzugte Art und Weise GUIs zu bauen, wollte es aber mal hier erwähnen.
Ein etwas älterer Beitrag dazu lässt sich auf Byte-Welt finden:
http://forum.byte-welt.net/sonstiges/byte-welt-fundgrube/541-swingx-components-netbeans-installieren.html