Zum Inhalt springen
L

Wikipedia · einfach zusammengefasst · Stand

Swing (Java)

Swing ist ein GUI-Toolkit für die Programmiersprache Java von Sun Microsystems. Seit Java-Version 1.2 (1998) ist es Bestandteil der Java-Runtime.

Inhalt5 Abschnitte
  1. 1. Grundlagen und Aufbau
  2. 2. Erscheinungsbild und Komponenten
  3. 3. Multithreading und Ereignisverarbeitung
  4. 4. Typisches Programmbeispiel
  5. 5. Geschichte, Erweiterungen und Werkzeuge

Grundlagen und Aufbau

Swing ist ein GUI-Toolkit für die Programmiersprache Java. GUI steht für grafische Benutzeroberfläche. Seit Java 1.2 (1998) gehört Swing zur Java-Runtime und damit zu den Java Foundation Classes (JFC). Diese Sammlung stellt Bibliotheken für grafische Benutzerschnittstellen bereit, darunter Java 2D, die Java Accessibility API (JAAPI), das Drag-and-Drop-API und das Abstract Window Toolkit (AWT). Swing baut auf dem älteren AWT auf und ist mit den anderen genannten APIs verbunden.

Swing ist modular und objektorientiert aufgebaut. Dadurch eignet es sich besonders für komplexe Anwendungen. Die Plattformunabhängigkeit von Java verringert den Entwicklungs- und Testaufwand, weil Anwendungen grundsätzlich auf verschiedenen Betriebssystemen eingesetzt werden können. Ein Hauptkonkurrent ist SWT, das für Eclipse entwickelt wurde. Als designierter Nachfolger gilt JavaFX, das seit März 2014 im Oracle JDK enthalten ist, bisher jedoch nicht durch den Java Community Process als offizieller Java-Standard spezifiziert wurde.

Erscheinungsbild und Komponenten

Das Aussehen einer Swing-Anwendung wird durch das Look-and-Feel bestimmt: „Look“ bezeichnet das Erscheinungsbild, „Feel“ das Verhalten der Komponenten. Das Look-and-Feel kann ausgetauscht werden, ohne die Anwendung grundsätzlich neu zu entwickeln. Auf allen Plattformen stehen Motif und Metal zur Verfügung; ab Java 5 ist Ocean das Standard-Look-and-Feel. Unter Linux, Mac und Windows gibt es zusätzlich jeweils ein an das übliche Systemerscheinungsbild angepasstes Look-and-Feel.

Seit Java 1.5 gibt es Synth. Sein aus Bildern zusammengesetztes Erscheinungsbild wird in einer XML-Datei beschrieben, sodass dafür kein Java-Code geschrieben werden muss. Mit Java 1.6, Update 10, wurde Nimbus eingeführt, ein vollständig vektorbasiertes Look-and-Feel. Daneben existieren weitere unabhängig entwickelte Erscheinungsbilder, von denen viele auf Metal basieren.

Swing-Komponenten werden direkt durch Java gezeichnet und benötigen keine nativen Komponenten des Betriebssystems. Diese Eigenschaft wird als Lightweight UI bezeichnet. Deshalb verhalten sich Swing-Komponenten auf allen Plattformen gleich und funktionieren auch dann, wenn das jeweilige Betriebssystem keine entsprechende Komponente anbietet. Der Nachteil ist, dass eine Swing-Anwendung zunächst nicht unbedingt wie eine speziell für das Betriebssystem entwickelte Anwendung aussieht. Ein passendes Look-and-Feel kann diesen Unterschied ausgleichen.

Gegenüber AWT bietet Swing zusätzliche Möglichkeiten und Komponenten: Tastenkombinationen zur Steuerung von Komponenten (Keyboard Accelerators), Drag and Drop, frei wählbare Look-and-Feels, Tooltips, automatisches Double Buffering, neue Layout-Manager und Panels, Anwendungen mit Multiple Document Interface sowie Komponenten für Tabellen und Baumstrukturen.

Multithreading und Ereignisverarbeitung

Swing ist nicht thread-sicher. Wenn mehrere Threads unkontrolliert auf Swing-Komponenten zugreifen, kann es zu unerwarteten Wechselwirkungen kommen. Deshalb sollen Swing-Komponenten grundsätzlich im Event Dispatch Thread (EDT) erzeugt und verändert werden, sofern die Dokumentation nicht ausdrücklich etwas anderes erlaubt. Der EDT ist ein AWT-Thread, der die grafische Ereignisverarbeitung von Java-Anwendungen übernimmt.

Für Aufrufe aus anderen Threads stellt SwingUtilities zwei Methoden bereit. invokeLater fügt ein Runnable-Objekt, also ein ausführbares Objekt, in die AWT-Ereigniswarteschlange ein und kehrt sofort zum aufrufenden Code zurück. Der aufrufende Thread wird daher nicht blockiert. invokeAndWait fügt das Objekt ebenfalls in die Ereigniswarteschlange ein, wartet aber bis zu seiner Ausführung; der aufrufende Thread wird blockiert.

Fehler bei der Einhaltung dieser Regeln werden dem Programmierer nicht automatisch gemeldet. Dadurch können Probleme lange unentdeckt bleiben. SWT und .NET WinForms behandeln fehlerhafte Aufrufe anders und melden sie sofort.

Für längere Aufgaben gibt es SwingWorker. Die Klasse war zunächst außerhalb des JRE verfügbar und ist seit Java 1.6 als javax.swing.SwingWorker enthalten. Eine Methode von SwingWorker läuft in einem eigenen Thread und kann eine längere Operation ausführen. Eine weitere Methode wird nach deren Ende im EDT ausgeführt und darf Swing-Komponenten verändern. Zusätzlich können Zwischenschritte, etwa der Fortschritt einer Operation, angezeigt werden.

Typisches Programmbeispiel

Das Hallo-Welt-Programm zeigt den grundlegenden Aufbau einer Swing-Anwendung. Zunächst wird mit JFrame ein Fenster mit dem Titel „Hallo Welt mit Swing“ erzeugt. Mit setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) wird festgelegt, dass das Programm beim Schließen des Fensters beendet wird. Ein JLabel mit dem Text „Hallo Welt“ wird in das Fenster eingefügt. Anschließend erhält das Fenster mit setSize(300, 200) die Größe 300 × 200 und wird durch setVisible(true) sichtbar gemacht.

Der GUI-Code wird in ein Runnable-Objekt verpackt und mit SwingUtilities.invokeLater(guiCreator) zur Ausführung im Event Dispatch Thread eingeplant. Der Thread, der main ausführt, ist normalerweise nicht der EDT. Er erzeugt daher nur das Runnable-Objekt und weist Swing an, den darin enthaltenen GUI-Code später im EDT auszuführen. So wird die Regel eingehalten, Swing-Komponenten grundsätzlich im EDT zu erzeugen und zu verändern.

Geschichte, Erweiterungen und Werkzeuge

Swing wurde Ende 1997 erstmals mit JDK 1.1.5 als externe Bibliothek ausgeliefert. Ende 1998, mit JDK 1.2 („Java 2“), wurde es fester Bestandteil der Java-Laufzeitumgebung. Anfangs galt Swing als wenig performant und für ernsthafte Anwendungen als ungeeignet. Auch der damalige Standardstil der Swing-Fenster wurde häufig negativ beurteilt. Sun verbesserte daraufhin sowohl die mitgelieferten Look-and-Feels als auch die Leistung. Durch bessere Hardwareunterstützung für Grafikkarten, optimierte Klassenbibliotheken und Verbesserungen der Java Runtime nahm die Performance deutlich zu. Spätestens seit Java 1.4 (2002) waren laut Artikel keine merkbaren Leistungsunterschiede zu nativen GUIs festzustellen; auch Vergleiche mit SWT zeigten keine Performanceunterschiede.

Swing besitzt ein integriertes Plug-in-Konzept. Dadurch lassen sich unter anderem Look-and-Feels, Layout-Manager und zusätzliche Komponenten einbinden. Das Open-Source-Projekt SwingLabs diente als Erweiterungssammlung und als Testumgebung für zukünftige Swing-Funktionen. Dort wurden unter anderem die in Java 6 eingeführten Klassen GroupLayout, SystemTray und Desktop entwickelt beziehungsweise bereitgestellt. Weitere Erweiterungen wurden im Java Desktop Swing Depot der java.net Java Desktop Community gesammelt. JGoodies von Karsten Lentzsch bietet ebenfalls Swing-Erweiterungen, darunter FormLayout. Spring Richclient integrierte Swing in das Spring Framework, wurde aber seit Mitte 2009 nicht mehr weiterentwickelt.

Für die visuelle Erstellung von Swing-Oberflächen gibt es meist kostenpflichtige WYSIWYG-Werkzeuge. Genannt werden JFormDesigner als eigenständiger Editor und als Plugin für Eclipse, IntelliJ IDEA und JBuilder, Jigloo als Eclipse-Plugin für Swing- und SWT-GUIs, Eclipse WindowBuilder als offizielles Eclipse-Plugin für Swing, SWT, AWT und GWT sowie Matisse4MyEclipse als Portierung des NetBeans-GUI-Builders für Eclipse und Swing. Der Visual Editor war ein Open-Source-Eclipse-Plugin für Swing- und SWT-GUIs; das zugehörige Entwicklungsprojekt war seit April 2012 nicht mehr aktiv.

Weiterlesen