In diesem Abschnitt wird eine kurze Übersicht der wesentlichen Konzepte der Swing-Komponenten und einiger AWT-Klassen gegeben. Die für die Programmierung notwendigen Details sind bei Java generell der HTML-On-Line-Dokumentation zu entnehmen.
Das Basis-Paket für Grafik- und Oberflächenprogrammierung ist javax.swing. Wie schon erwähnt, werden die dort zur Verfügung gestellten Klassen auf entsprechende Elemente eines schon vorhandenen Window-Systems abgebildet. Zu diesem Zweck gibt es das Paket java.awt.peer, das aber normalerweise vom Programmierer nicht direkt benutzt wird.
Weitere verwandte Klassen sind z.Zt. (d.h. in der Java-Version 1.1.x) java.awt.image mit Klassen für die direkte Manipulation von Bildern, java.awt.event für das neue Eventhandling-Konzept, sowie java.awt.datatransfer mit Möglichkeiten zum Datenaustausch zwischen Applikationen. Erwähnt werden sollte hier auch javax.swing.applet, dessen einzige Klasse JApplet verwendet wird, wenn man Java-Programme in einem HTML-Dokument benutzen will.
Die Klassen des swing-Pakets lassen sich grob in drei Gruppen einteilen: Grafikklassen, in denen grafische Objekte wie Farben, Fonts, Bilder beschrieben werden; Komponenten, d.h. Klassen, die GUI-Komponenten wie z.B. Buttons, Menüs und Textfelder zur Verfügung stellen; sowie Layout-Manager, die die Anordnung von GUI-Komponenten in einer Applikation kontrollieren. Aus den verwandten Paketen sollen hier noch die Event-Listener besprochen werden, mit deren Hilfe die Interaktion zwischen User und Applikationen implementiert werden muß. Die folgende Übersicht erhebt keinen Anspruch auf Vollständigkeit, sondern beschreibt nur kurz die für Computergrafik-Programme wichtigen Klassen. Weitere Klassen sowie alle Details sind der entsprechenden On-Line-Dokumentation zu entnehmen.
Die Grafik-Klassen
Die Grafik-Klassen implementieren jeweils einen bestimmten Aspekt und sind weitgehend unabhängig voneinander. Wichtige Klassen des AWT sind Color, Cursor, Font, FontMetrics, Image, MediaTracker, deren Bedeutung aus dem jeweiligen Namen ersichtlich ist. Wichtige Hilfsklassen sind Dimension, Point, Polygon, Rectangle, die jeweils entsprechende Objekte verwalten. Dabei ist zu beachten, daß alle diese Objekte keine Methoden haben, mit denen sie sich z.B. auf dem Schirm darstellen können. Diese Funktionalität wird durch die Klasse Graphcis bereitgestellt, in der Methoden vorhanden sind, um Bilder und andere grafische Objekte zu zeichnen, zu füllen, Farben oder Fonts zu ändern, Ausschnitte zu kopieren oder zu clippen usw. Diese abstrakte Klasse wird von diversen Komponenten bereitgestellt und kann dann verwendet werden, um das Aussehen dieser Komponente zu manipulieren.
Die GUI-Komponenten
Die Komponenten, mit deren Hilfe der Benutzer mit einer Oberfläche interagieren kann, lassen sich in drei Gruppen einteilen:
Es gibt Komponenten, die andere Komponenten aufnehmen und anordnen können. Sie werden Container genannt und unterteilen sich wiederum in drei Gruppen:
Weiterhin gibt es Komponenten, die eine spezielle Funktionalität bereitstellen und als Basic Controls bezeichnet werden.
Außerdem gibt es noch Displays, die auf unterschiedliche aber für die einzelne Klasse spezifische Weise Informationen anzeigen. Einige Klassen können editierbar (editable) erzeugt werden:
Andere sind nicht editierbar (uneditable). Hierzu gehören z.B.:
Da es die hier genannten Komponenten zum Teil auch in java.awt gibt, wurde den Swing-Komponentennamen zur besseren Unterscheidung jeweils ein ``J'' vorangestellt.
Da alle Komponenten von der Klasse javax.swing.JComponent abgeleitet wurden, die ihrerseits von java.awt.Container abstammt, kann jede Instanz einer dieser Klassen wiederum selber andere Komponenten aufnehmen und diese in ihrem Inneren frei anordnen. Dieses Layout regelt eine weitere wichtige Gruppe von Klassen:
Die Layout-Manager
Die wesentliche Aufgabe eines Containers ist die Darstellung der darin enthaltenen Komponenten. Zur Steuerung der Anordnung dieser Komponenten werden Klassen verwendet, die das Interface Layout-Manager adaptieren. Ein solcher Layout-Manager implementiert dazu eine spezielle Layout-Politik, die mehr oder weniger konfigurierbar ist. Es gibt die folgenden vordefinierten Layout-Manager, die alle aus java.awt stammen:
Alle diese Layout-Manager bestimmen nur die Anordnung der GUI-Elemente, nicht aber deren Look-And-Feel. Diese Aufgabe übernimmt der User Interface Manager (UIManager). Mit dieser Klasse kann aus den mitgelieferten (z.Zt. Java, Mac, Motif und MS Windows) und evtl. selbstimplementierten Look-And-Feel's gewählt werden.
Event-Handling
Eine offene Frage ist nun noch, wie das Aktivieren einer GUI-Komponente eine entsprechende Aktion im Benutzer-Programm auslöst. Dazu gibt es in AWT folgendes Konzept: Eine Aktion des Benutzers -- wie z.B. ein Mausklick -- erzeugt in der Java-Maschine einen Event. Je nach Art der Aktion und des Kontextes, in dem sie stattfindet, ergeben sich verschiedene Event-Typen, die wiederum verschiedene Argumente haben können. Eine Komponente kann für sie geeignete Events empfangen, indem ein sogenannter Event-Listener mit der Komponente verbunden wird. Für die verschiedenen Event-Typen gibt es verschiedene Listener, von denen einer oder mehrere bei einer Komponente eingetragen werden können. Ein Listener ist dabei ein Interface, in dem alle Methoden vorgegeben werden, die für eine Menge von zusammengehörigen Events notwendig sind. Tabelle 2.1 gibt eine Übersicht der verschiedenen Event-Listener:
Listener | Methoden | Komponenten |
Action | actionPerformed | JButton, JList, JMenuItem, JTextField |
Adjustment | adjustmentValueChanged | JScrollBar |
Component | componentHidden | JComponent |
componentMoved | ||
componentResized | ||
componentShown | ||
Container | componentAdded | Container |
componentRemoved | ||
Focus | focusGained | JComponent |
focusLost | ||
Item | itemStateChanged | JCheckbox, JComboBox, JList |
Key | keyPressed | JComponent |
keyReleased | ||
keyTyped | ||
Mouse | mouseClicked | JComponent |
mouseEntered | ||
mouseExited | ||
mousePressed | ||
mouseReleased | ||
MouseMotion | mouseDragged | JComponent |
mouseMoved | ||
Text | textValueChanged | JTextComponent |
Window | windowActivated | JWindow |
windowClosed | ||
windowClosing | ||
windowDeactivated | ||
windowDeiconified | ||
windowIconified | ||
windowOpened |
Für einige der Swing-Komponenten wurden zusätzliche EventListener implementiert. Sie befinden sich in dem Paket javax.swing.event. Sie kommen nur bei spezialisierten Komponenten zum Einsatz und werden daher hier nicht ausführlich beschrieben.