Programmieren in Java: Aufbau


Kapitel 2: Swing


Inhaltsverzeichnis

Dieses Buch ist unter einer Creative Commons-Lizenz lizensiert.


2.1 Allgemeines

Besser als AWT

Als die Version 1.2 von Java veröffentlicht wurde, enthielt sie ein neues Merkmal, durch das sich Java 1.2 entscheidend von Java 1.1 abhob: Die Swing-Klassenhierarchie - seit Java 1.2 offiziell zum Java-Standard zugehörig - stellt dem Java-Programmierer neue Werkzeuge zur Entwicklung von Oberflächen in Programmen, kurz GUIs genannt, zur Verfügung. War für den Java-Entwickler bis einschließlich Version 1.1 AWT die gefragte Klassen-Sammlung zur Entwicklung von GUIs, so kann ab Version 1.2 zwischen AWT und Swing gewählt werden.

Swing-Klassen sind sogenannte lightweight-Komponenten, AWT-Klassen im Gegensatz zu Swing sogenannte heavyweight-Komponenten. Während AWT-Klassen sehr betriebssystemnah arbeiten, sind Swing-Klassen zu 100 Prozent in Java entwickelt. Das hat den Vorteil, dass Sie zum Beispiel bei Java-Anwendungen, die mit Swing entwickelt sind, das Look-and-Feel einstellen können. Sie können also Ihrer Java-Anwendung das typische Windows-Look-and-Feel geben, selbst dann, wenn Ihre Anwendung unter einem anderen Betriebssystem als Windows ausgeführt wird. Anwendungen, die auf AWT basieren, passen sich in ihrem Look-and-Feel immer dem Betriebssystem an, auf dem sie gerade ausgeführt werden.

Da AWT seit der ersten Java-Version zur Verfügung steht und Swing erst seit Java 1.2, konnten natürlich viele Erfahrungen, die über die Jahre gewonnen wurden, in die Entwicklung der neuen Klassenhierarchie einfließen. So ist das Arbeiten mit Swing-Klassen nicht nur etwas einfacher geworden als mit ihren AWT-Gegenstücken. Swing-Klassen bieten auch mehr Features an als AWT-Klassen. Es gibt zum Beispiel neue Steuerelemente wie Schieberegler, die es in AWT nicht gab.

In diesem Kapitel werden Sie in die Arbeitsweise mit Swing-Klassen eingeführt. Das Kapitel orientiert sich an der Swing-Klassenhierarchie, wie sie erstmals in der Version 1.2 von Java vorlag.


2.2 Die Swing-Packages

15 neue Pakete

Die Swing-API - also die Programmierschnittstelle rund um Swing - besteht in Java 1.2 aus 15 Paketen. Alle 15 Pakete sind in einer neuen Hierarchie namens javax untergebracht. Gab es bis einschließlich Java 1.1 lediglich eine Hierarchie namens java, so wurde der Übersicht wegen eine neue Klassenhierarchie in Java 1.2 eingeführt.

Swing ist in Java 1.2 in folgende Pakete eingeteilt.

  • javax.accessibility enthält Klassen, um Java-Anwendungen, die auf Swing basieren, auch auf anderen Geräten und anderen Ein- und Ausgabemedien als auf dem Computer anwendbar zu machen. Die meisten Klassen, die Sie verwenden, um grafische Benutzeroberflächen mit Swing zu erstellen, unterstützen standardmäßig auch Nicht-PCs, um zum Beispiel Swing-Anwendungen per Sprache zu steuern.

  • javax.swing ist eigentlich das wichtigste Paket und enthält alle Klassen, um grafische Benutzerelemente zu erstellen. In den allermeisten Fällen brauchen Sie nur dieses Paket zu importieren, wenn Sie Anwendungen mit Hilfe von Swing erstellen wollen.

  • javax.swing.border bietet Klassen an, mit denen um grafische Benutzerelemente Rahmen gezeichnet werden können. Normalerweise benötigen Sie dieses Package nicht direkt, wenn Sie Rahmen zeichnen wollen. Sie greifen nur dann auf dieses Paket zu, wenn Ihnen die zur Auswahl stehenden Standardrahmen nicht gefallen und Sie eigene Rahmen definieren wollen.

  • javax.swing.colorchooser wird benötigt, wenn Sie die Klasse javax.swing.JColorChooser einsetzen wollen, um dem Anwender ein Schaltelement zu präsentieren, das die Auswahl einer Farbe ermöglicht.

  • javax.swing.event ist für Swing das, was java.awt.event für AWT ist: Dieses Paket enthält Interfaces und Klassen, um auf Benutzereingaben auf Swing-Elementen reagieren zu können. Dieses Paket stellt genaugenommen lediglich eine Erweiterung der Klassen aus java.awt.event dar, da auch die Interfaces und Klassen aus jenem Paket für Swing-Elemente verwendet werden.

  • javax.swing.filechooser enthält Klassen, die vom Steuerelement javax.swing.JFileChooser benötigt werden. Sie greifen also nur auf das Paket zu, wenn Sie das Steuerelement javax.swing.JFileChooser einsetzen wollen.

  • javax.swing.plaf bietet eine Auswahl verschiedener Klassen an, über die jeweils das Look-and-Feel einer Java-Anwendung gezielt eingestellt werden kann. Während auf AWT basierende Java-Anwendungen sich stets dem Look-and-Feel der Plattform anpassen, auf der sie ausgeführt werden, kann über Klassen in diesem Paket für auf Swing basierende Anwendungen ein Look-and-Feel fest vorgegeben werden.

  • javax.swing.plaf.basic enthält Klassen, um grundlegende Funktionen für ein Look-and-Feel zu unterstützen.

  • javax.swing.plaf.metal ist verantwortlich für das Standard-Look-and-Feel von Java. Das Paket heißt metal, da dies einmal der Codename für das Java-Look-and-Feel war.

  • javax.swing.plaf.multi bietet die Möglichkeit, verschiedenartige Look-and-Feels zu kombinieren.

  • javax.swing.table wird nur dann benötigt, wenn Sie das Steuerelement javax.swing.JTable verwenden wollen, um eine Tabelle anzuzeigen.

  • javax.swing.text enthält Code zur Unterstützung von Text-Eingabefeldern.

  • javax.swing.text.html enthält Code zur Unterstützung spezieller HTML-Eingabefelder.

  • javax.swing.tree benötigen Sie nur dann, wenn Sie das Steuerelement javax.swing.JTree einsetzen möchten, um eine hierarchische Aufzählung anzuzeigen.

  • javax.swing.undo enthält Code, um Undo- und Redo-Funktionen in Java-Anwendungen einfach zu entwickeln.

In Java 1.4 kamen zwei weitere Pakete namens javax.swing.html.parser und javax.swing.text.rtf hinzu.


2.3 Container und Komponenten

Die Swing-Steuerelemente

Fast alle Swing-Klassen, die dazu dienen, grafische Benutzeroberflächen zu erstellen, können in Container und Komponenten eingeteilt werden. Container sind Steuerelemente, die ihrerseits die Fähigkeit besitzen, andere Container oder Komponenten in sich aufzunehmen und anzuzeigen. Komponenten sind Steuerelemente, die als Einheit dem Anwender irgendeine Funktion anbieten oder Informationen anzeigen, ohne dass andere Steuerelemente in einer Komponente aufgenommen werden können. In der englischsprachigen Fachliteratur werden Komponenten daher auch Atomic Components genannt. Alle grafischen Steuerelemente liegen im Paket javax.swing.

Container werden in zwei Gruppen unterschieden. Es gibt Top-Level Container und Intermediate Swing Container. Top-Level Container sind der äußerste Container, der andere Container in sich aufnehmen kann, jedoch seinerseits in keinem anderen Container enthalten ist. Intermediate Swing Container werden entweder in einem Top-Level Container oder in anderen Intermediate Swing Containern platziert. Sie unterteilen Flächen und bieten Platz für Atomic Components an.

Folgende Top-Level Container sind Bestandteil von Swing.

  • javax.swing.JFrame ist die Klasse zum Erstellen vollwertiger Fenster-Applikationen mit Titelleiste und Menü.

  • javax.swing.JDialog wird verwendet, um einfache Dialogfenster anzuzeigen.

  • javax.swing.JApplet ist die Klasse, die zur Entwicklung von Java-Applets mit Swing benötigt wird.

Alle drei obigen Klassen können Intermediate Swing Container und Atomic Components in sich aufnehmen. Für Applet-Entwickler ist darüberhinaus wichtig anzumerken, dass Java-Applets, die auf Swing basieren, Menüs besitzen können.

AWT-erfahrene Entwickler wundern sich möglicherweise, warum es in Swing scheinbar kein Äquivalent zur Klasse java.awt.FileDialog gibt. Swing bietet eine Klasse javax.swing.JFileChooser an, die jedoch kein Top-Level Container, sondern eine Atomic Component ist. Das hat den Vorteil, dass Sie nun dem Anwender eine Datei-Öffnen-Möglichkeit anbieten können, ohne dass Sie dies jeweils in einem eigenen Dialogfenster tun müssen.

Folgende Intermediate Swing Container gibt es.

  • javax.swing.JPanel ist der Standard-Intermediate Swing Container schlechthin. Diese Klasse hat keine andere Funktion als einen Container weiter zu unterteilen, um somit die Anordnung von Atomic Components zu erleichtern oder sie jeweils ihrer Funktion nach auf einem Panel zu gruppieren.

  • javax.swing.JScrollPane ist eine Art Fenster auf ein dahinterliegendes größeres Dokument. Diese Klasse bietet Scrolleisten an, um das Dokument zu verschieben und sich so durch das Fenster das Dokument beliebig ansehen zu können. Das Dokument an sich kann ein anderer Intermediate Swing Container sein oder aber eine Atomic Component.

  • javax.swing.JSplitPane wird verwendet, um einen Container in zwei Bereiche zu unterteilen, die ihrerseits wieder als Container dienen. Es ist lediglich eine Unterteilung in genau zwei Bereiche möglich, nicht mehr. Ob die zwei Bereiche horizontal oder vertikal nebeneinander angeordnet werden, kann über den Konstruktor festgelegt werden.

  • javax.swing.JTabbedPane ist die Klasse für das Erzeugen von Registerkartensteuerelementen.

  • javax.swing.JToolBar wird verwendet, um Symbolleisten zu entwickeln.

  • javax.swing.JInternalFrame erstellt ein neues Fenster in einem Top-Level Container, das beliebig in seiner Größe geändert, verschoben und auch zu einem Icon verkleinert werden kann. Diese Klasse wird verwendet, um MDI-Applikationen zu entwickeln - also Anwendungen, die neue Dokumente in Fenstern innerhalb eines einzigen Anwendungsfensters öffnen.

  • javax.swing.JLayeredPane ermöglicht es, Intermediate Swing Container übereinander zu legen, so dass sich die Container überschneiden.

  • javax.swing.JRootPane ist eine für den Entwickler von Java-Anwendungen normalerweise unsichtbar im Hintergrund arbeitende Klasse. Sie stellt standardmäßig die Fläche in Top-Level Containern dar, auf der Intermediate Swing Container und Atomic Components eingefügt werden.

Intermediate Swing Components bieten vielfältige Möglichkeiten an, Top-Level Container oder andere Intermediate Swing Components in Flächen zu unterteilen, auf denen Atomic Components gruppiert werden können.

Die Swing-Klassenhierarchie kennt folgende Atomic Components.

  • javax.swing.JButton ist die Klasse zum Anzeigen typischer anklickbarer Schaltflächen, wie Sie sie von den Standard-Schaltflächen in Windows für OK und Abbrechen kennen.

  • javax.swing.JCheckBox wird verwendet, um Kontrollkästchen anzuzeigen.

  • javax.swing.JRadioButton wird zusammen mit javax.swing.ButtonGroup verwendet, um Optionen zu erstellen und zu gruppieren. Der Unterschied zwischen Optionen und Kontrollkästchen ist, dass jeweils nur eine einzige Option in einer Gruppe aktiviert sein kann.

  • javax.swing.JComboBox ist die Klasse, mit der Kombinationsschaltflächen erzeugt werden.

  • javax.swing.JList erstellt Listen, in denen vom Anwender entweder genau ein Eintrag oder aber mehrere Einträge markiert werden können.

  • javax.swing.JMenuBar wird mit javax.swing.JMenu, javax.swing.JMenuItem und javax.swing.JCheckBoxMenuItem verwendet, um Menüs aufzubauen.

  • javax.swing.JSlider präsentiert dem Anwender einen Schieberegler.

  • javax.swing.JTextField stellt ein einzeiliges Texteingabefeld dar.

  • javax.swing.JTextArea ist ein mehrzeiliges Texteingabefeld.

  • javax.swing.JLabel ist eine Klasse zum Anzeigen eines statischen Textes oder Bildes, das auf keine Benutzereingaben reagiert.

  • javax.swing.JProgressBar zeigt einen Balken an, der ähnlich wie zum Beispiel bei der Installation von Software den Verlauf eines Vorgangs darstellt, indem der Balken von 0 bis 100 Prozent gefüllt wird.

  • javax.swing.JToolTip präsentiert dem Anwender einen Tooltip, wenn die Maus über eine Schaltfläche bewegt wird und stehen bleibt.

  • javax.swing.JColorChooser wird verwendet, um dem Anwender eine Auswahlmöglichkeit zwischen Farben anzubieten.

  • javax.swing.JFileChooser erlaubt dem Anwender das Navigieren in Verzeichnissystemen, um zum Beispiel eine zu öffnende Datei zu bestimmen.

  • javax.swing.JTable zeigt Tabellen an.

  • javax.swing.JTree präsentiert dem Anwender ein Auswahlmenü, in dem Einträge hierarchisch geordnet sind.

Wenn Sie Anwendungen basierend auf Swing erstellen, entwerfen Sie die GUI, indem Sie sich der verschiedenen Swing-Klassen bedienen, Objekte erstellen, diese über Methoden-Aufrufe konfigurieren und Sie dann einer Oberfläche hinzufügen.


2.4 Aufbau einer Swing-Anwendung

Vorgehensweise und Fallen

Sie benötigen immer einen Top-Level Container, wenn Sie Swing-Anwendungen entwickeln. Der Top-Level Container ist entweder ein leeres Fenster oder aber die Applet-Oberfläche, der Sie dann im Folgenden Intermediate Swing Container oder Atomic Components hinzufügen können. Sie wählen also zuerst einen geeigneten Top-Level Container aus - für Java-Applets javax.swing.JApplet, für Java-Applications für gewöhlich javax.swing.JFrame - und fügen dann dem Top-Level Container ihre Steuerelemente hinzu.

Wie Steuerelemente, die Sie Containern hinzufügen, angeordnet werden, hängt wie bei AWT auch von den verwendeten Layout Managern ab. Jeder Container verwendet einen Standard-Layout Manager, der festlegt, inwiefern Steuerelemente zueinander im Container angeordnet werden. Swing-Anwendungen verwenden die gleichen Layout Manager wie AWT-Anwendungen, also die Klassen java.awt.FlowLayout, java.awt.BorderLayout, java.awt.CardLayout, java.awt.GridLayout und java.awt.GridBagLayout. Sie finden weitere Informationen zu diesen Layout Managern im Kapitel 1, Abstract Window Toolkit.

Swing kennt darüberhinaus einen neuen Layout Manager namens javax.swing.BoxLayout. Dieser Layout Manager stellt Steuerelemente in eine Reihe, entweder horizontal oder vertikal, und bietet umfangreiche Funktionen zur Ausrichtung der Steuerelemente an. Sie können darüberhinaus zwischen Steuerelementen Platzhalter setzen, die einen festen Raum beanspruchen und auf diese Weise Steuerelemente voneinandern trennen. Außerdem gibt es Platzhalter, die sich ausdehnen und so zum Beispiel zwei Steuerelemente links und rechts in einer Reihe ausrichten.

Selbstverständlich können Sie auch Swing-Anwendungen ohne Layout Manager erstellen und alle Container und Komponenten pixelgenau ausrichten. Wie bei AWT-Anwendungen auch müssen Sie den Standard-Layout Manager deaktivieren, indem Sie setLayout(null) für den entsprechenden Container aufrufen.

Wenn Sie die Entwicklung von AWT-Anwendungen gewohnt sind, gibt es einen kleinen, aber wichtigen Unterschied zu Swing, wenn Sie Steuerelemente einem Top-Level Container hinzufügen wollen. Sie fügen nämlich Steuerelemente nie direkt einem Top-Level Container hinzu, sondern immer nur dem sogenannten Content Pane. Wenn Sie es bei AWT gewohnt waren, mit add() neue Komponenten in einer Fläche zu platzieren, so müssen Sie sich bei Swing-Anwendungen jeweils zuerst Zugriff auf den Content Pane eines Top-Level Containers verschaffen und diesem dann mit add() die entsprechenden Komponenten hinzufügen.

import javax.swing.*; 
import java.awt.Container; 

public class MyApplet extends JApplet 
{ 
  public void init() 
  { 
    Container contentPane = getContentPane(); 
    contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS)); 
    JButton button1 = new JButton("Button 1"); 
    JButton button2 = new JButton("Button 2"); 
    JButton button3 = new JButton("Button 3"); 
    contentPane.add(button1); 
    contentPane.add(button2); 
    contentPane.add(button3); 
  } 
} 

Der Content Pane ist nichts geheimnisvolles, sondern lediglich ein Container, der vom Applet oder Fenster verwendet wird, um darin andere Container oder Komponenten anzuzeigen. Sie können sich jederzeit Zugriff auf den Content Pane mit getContentPane() verschaffen. Diese Methode ist in allen drei Top-Level Containern javax.swing.JFrame, javax.swing.JDialog und javax.swing.JApplet definiert. Das einzige Steuerelement, das eine Ausnahme bildet und nicht dem Content Pane, sondern direkt dem Top-Level Container hinzugefügt wird, ist die Menüleiste. Sie wird in allen Top-Level Containern mit setJMenuBar() gesetzt.

Auf Benutzereingaben zu reagieren funktioniert mit Swing-Anwendungen genauso wie mit AWT-Anwendungen. Objekte, die auf Klassen basieren, die entsprechende Listener-Interfaces implementieren, werden bei Steuerelementen registriert, die bei Eintreten eines Ereignisses Signale aussenden. Swing-Anwendungen greifen auf dieselben Interfaces zu wie AWT-Anwendungen, also auf diejenigen aus dem Paket java.awt.event. Darüberhinaus stehen Swing-Anwendungen neue Interfaces zur Verfügung, die im Paket javax.swing.event untergebracht sind.

Das Code-Beispiel von eben wird nun derart erweitert, dass sich bei Anklicken der ersten Schaltfläche ein Dialogfenster öffnet.

import javax.swing.*; 
import java.awt.Container; 
import java.awt.event.*; 

public class MyApplet extends JApplet implements ActionListener 
{ 
  public void init() 
  { 
    Container contentPane = getContentPane(); 
    contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS)); 
    JButton button1 = new JButton("Button 1"); 
    button1.addActionListener(this); 
    JButton button2 = new JButton("Button 2"); 
    JButton button3 = new JButton("Button 3"); 
    contentPane.add(button1); 
    contentPane.add(button2); 
    contentPane.add(button3); 
  } 

  public void actionPerformed(ActionEvent ev) 
  { 
    JDialog dialog = new JDialog(); 
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
    dialog.setSize(400, 100); 
    Container contentPane = dialog.getContentPane(); 
    JLabel label = new JLabel("Dialog"); 
    contentPane.add(label); 
    dialog.show(); 
  } 
} 

Damit die Instanz der Klasse MyApplet - also das Java-Applet im Browser selber - auf Mausklicks auf die erste Schaltfläche reagieren kann, muss die Klasse das Interface java.awt.event.ActionListener implementieren. Das heißt, es muss eine Methode actionPerformed() definiert werden, die bei Mausklick ausgeführt wird. Um nun dem Java-System mitzuteilen, dass bei einem Mausklick auf die erste Schaltfläche das Ereignis an die Instanz der Klasse MyApplet gemeldet wird, muss für das entsprechende Objekt, das die erste Schaltfläche im Applet repräsentiert, die Methode addActionListener() aufgerufen werden. Als Parameter wird this übergeben - das Empfängerobjekt für Ereignisse.


2.5 Praxis-Beispiel

So geht's

Im Praxis-Beispiel wird genau die gleiche Aufgabe umgesetzt wie im Kapitel 1, Abstract Window Toolkit. Es geht darum, ein Java-Applet zu entwickeln, das bei Mausklick ein Fenster öffnet, in das der Anwender seine Körpergröße in cm und sein Gewicht in kg eingeben kann. Ein weiterer Mausklick auf eine Schaltfläche im Fenster führt zu einer kleinen Berechnung, in der das Applet versucht herauszufinden, ob der Anwender Normal-, Unter- oder Übergewicht hat.

import javax.swing.*; 
import java.awt.BorderLayout; 
import java.awt.event.*; 

public class MyApplet extends JApplet implements ActionListener 
{ 
  JButton Start; 

  public void init() 
  { 
    getContentPane().setLayout(new BorderLayout()); 
    Start = new JButton("Start"); 
    Start.addActionListener(this); 
    getContentPane().add(Start, BorderLayout.CENTER); 
  } 

  public void actionPerformed(ActionEvent ev) 
  { 
  } 
} 

Im ersten Schritt wird im Applet als neuer Layout Manager java.awt.BorderLayout eingestellt, um die anklickbare Schaltfläche in der Applet-Oberfläche zentriert anzeigen zu können. Dazu wird die Schaltfläche, die mit javax.swing.JButton erstellt wird, mit dem Parameter BorderLayout.CENTER an die Methode add() übergeben. Beachten Sie, dass Sie sowohl die Einstellung des Layout Managers als auch das Hinzufügen der Schaltfläche zur Applet-Oberfläche mit dem Content Pane bewerkstelligen müssen. Außerdem wurde bereits das Interface java.awt.event.ActionListener implementiert, damit auf einen Mausklick auf die Schaltfläche reagiert werden kann. Was genau passieren soll, wird später in der Methode actionPerformed() ergänzt.

import javax.swing.*; 
import java.awt.Container; 
import java.awt.GridLayout; 
import java.awt.event.*; 

public class MyFrame extends JFrame implements ActionListener 
{ 
  JLabel LabelSize, LabelWeight, LabelResult; 
  JTextField TextSize, TextWeight; 
  JButton OK; 

  public MyFrame() 
  { 
    setSize(400, 120); 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    Container contentPane = getContentPane(); 
    contentPane.setLayout(new GridLayout(3, 2)); 
    LabelSize = new JLabel("Ihre Körpergröße in cm:"); 
    LabelWeight = new JLabel("Ihr Gewicht in kg:"); 
    LabelResult = new JLabel(); 
    TextSize = new JTextField(); 
    TextWeight = new JTextField(); 
    OK = new JButton("OK"); 
    OK.addActionListener(this); 
    contentPane.add(LabelSize); 
    contentPane.add(TextSize); 
    contentPane.add(LabelWeight); 
    contentPane.add(TextWeight); 
    contentPane.add(LabelResult); 
    contentPane.add(OK); 
  } 

  public void actionPerformed(ActionEvent ev) 
  { 
    if (TextSize.getText().length() > 0 && TextWeight.getText().length() > 0) 
    { 
      try 
      { 
        int Size = Integer.parseInt(TextSize.getText()); 
        int Weight = Integer.parseInt(TextWeight.getText()); 
        double BMI = Weight / ((Size / 100.0) * (Size / 100.0)); 
        if (BMI < 18.5) 
        { 
          LabelResult.setText("Sie haben möglicherweise Untergewicht."); 
        } 
        else if (BMI > 30) 
        { 
          LabelResult.setText("Sie haben möglicherweise starkes Übergewicht."); 
        } 
        else if (BMI > 25) 
        { 
          LabelResult.setText("Sie haben möglicherweise Übergewicht."); 
        } 
        else 
        { 
          LabelResult.setText("Sie haben Normalgewicht."); 
        } 
      } catch (NumberFormatException ex) { } 
    } 
    else 
    { 
      LabelResult.setText("Geben Sie Größe und Gewicht an."); 
    } 
  } 
} 

Die Klasse MyFrame enthält den Code, um ein Fenster anzuzeigen, in das der Anwender Körpergröße und -gewicht eingeben kann. Der Aufbau des Fensters wird innerhalb des Konstruktors der Klasse MyFrame festgelegt. Es werden sechs Steuerelemente der Fensteroberfläche hinzugefügt und mit Hilfe des Layout Managers java.awt.GridLayout ausgerichtet.

Weil das Interface java.awt.event.ActionListener implementiert wird, kann ein Objekt dieser Klasse als Empfängerobjekt für Aktionen registriert werden, die auf der einzigen anklickbaren Schaltfläche im Fenster stattfinden. Für das Objekt OK wird dazu die Methode addActionListener() aufgerufen. Bei einem Mausklick oder bei Betätigen der Schaltfläche per Tastatur wird wie gewohnt actionPerformed() ausgeführt. Diese Methode enthält die Berechnung und gibt über das Objekt LabelResult das Ergebnis aus. Die Berechnung hat sich in keinster Weise geändert und ist identisch mit der Berechnung im Praxis-Beispiel aus dem Kapitel 1, Abstract Window Toolkit.

Im Gegensatz zum AWT-Beispiel implementiert die Klasse MyFrame jedoch nicht mehr das Interface java.awt.WindowListener. Dies ist nicht mehr nötig, da Dialogfenster in Swing sich standardmäßig automatisch schließen, wenn der Anwender eine entsprechende Aktion ausführt. Genaugenommen verschwinden Dialogfenster beim Schließen nur vom Bildschirm und sind im Computerspeicher noch vorhanden. Damit ein Dialogfenster wirklich restlos verschwindet, kann wie im Beispiel geschehen die Methode setDefaultCloseOperation() aufgerufen werden. Dieser Methode wird einfach die Konstante DISPOSE_ON_CLOSE übergeben, die aus der Klasse javax.swing.JFrame stammt. Da MyFrame eine Kind-Klasse dieser Klasse ist, steht die Konstante aufgrund der Vererbung auch in MyFrame zur Verfügung.

import javax.swing.*; 
import java.awt.BorderLayout; 
import java.awt.event.*; 

public class MyApplet extends JApplet implements ActionListener 
{ 
  JButton Start; 
  MyFrame Window; 

  public void init() 
  { 
    getContentPane().setLayout(new BorderLayout()); 
    Start = new JButton("Start"); 
    Start.addActionListener(this); 
    getContentPane().add(Start, BorderLayout.CENTER); 
    Window = new MyFrame(); 
  } 

  public void actionPerformed(ActionEvent ev) 
  { 
    Window.show(); 
  } 
} 

Die Klasse MyApplet wird im letzten Schritt derart erweitert, dass ein Objekt vom Typ MyFrame innerhalb der Methode init() erstellt wird. Das Objekt, das also das Fenster repräsentiert, wird bei Mausklick auf die Start-Schaltfläche mit Hilfe der Methode show() am Bildschirm sichtbar gemacht.


2.6 Aufgaben

Übung macht den Meister

Sie können die Lösungen zu allen Aufgaben in diesem Buch als ZIP-Datei erwerben.

  1. Konvertieren Sie das zweite Beispiel aus dem Abschnitt 1.5, „Benutzereingaben“ von AWT zu Swing.

    Die Konvertierung ist nicht ganz einfach: Suchen Sie zuerst nach den Swing-Klassen, die äquivalent zu den AWT-Klassen java.awt.Checkbox und java.awt.CheckboxGroup sind. Die Klasse javax.swing.JCheckBox gehört nicht dazu. Sehen Sie sich dann die Dokumentation der gefundenen Klassen an, um herauszufinden, inwiefern sich Methodenaufrufe geändert haben. In diesem Zusammenhang ist vor allem das Herausfinden der ausgewählten Option nicht mehr ganz so einfach wie unter AWT.

  2. Entwickeln Sie ein Java-Applet, das eine Kombinationsschaltfläche enthält, über die der Anwender zwischen den drei Farben Rot, Grün und Blau wählen kann. Die jeweils gewählte Farbe wird für den Hintergrund des Applets gesetzt.

    Zur Darstellung einer Kombinationsschaltfläche verwenden Sie die Klasse javax.swing.JComboBox. Um ein Ereignis abzufangen, wenn der Anwender einen Eintrag aus der Kombinationsschaltfläche wählt, müssen Sie das Interface java.awt.event.ItemListener implementieren. Beachten Sie, dass Sie die Methode setBackground() für den Content Pane des Java-Applets aufrufen müssen, um die Hintergrundfarbe zu setzen.