prev up inhalt next


2.7 Swing-Beispielapplikation

In diesem Abschnitt wird eine einfache Applikation gezeigt, die die Worte ``Hello World!'' in einem eigenen Fenster darstellt (siehe Abbildung 2.1 ).

Die Applikation besteht aus zwei Klassen. Die Klasse Hello stammt von JPanel ab und besitzt nur einen Konstruktor. Bei der Instanziierung wird ein JLabel der Größe 160 · 120 Pixel mit dem mittig plazierten String Hello World! erzeugt und zum Gebiet ``Zentrum'' des Containers (JPanel) hinzugefügt. Die Instanz der Klasse Hello enthält somit alle GUI-Komponenten, die die spezielle Funktionalität der Applikation ausmachen (hier die Darstellung eines Strings):

package HelloWorld;

import java.awt.Dimension;                       // Importliste mit allen
import java.awt.BorderLayout;                    // benoetigten Klassen aus
import javax.swing.UIManager;                    // dem AWT und aus den 
import javax.swing.JLabel;                       // Swing-Komponenten
import javax.swing.JPanel;

public class Hello extends JPanel {
  /** Erzeugt eine Instanz der Klasse Hello. */
  public Hello() {
    JLabel l = new JLabel("Hello World!");       // Label mit Text erzeugen
    l.setHorizontalAlignment(JLabel.CENTER);     // horizontal zentrieren
    l.setPreferredSize(new Dimension(160,120));  // Groesse festlegen

    add(l, BorderLayout.CENTER);
  }
}

Es fehlt noch der Top-Level Container, der den Rahmen für die Applikation bildet, indem er die Instanz der Klasse Hello aufnimmt und dadurch diese auf der grafischen Benutzungsoberfläche darstellbar macht. Diese Funktion übernimmt die Klasse HelloApp. Sie besteht aus einem Konstruktor, der Methode main und den Methoden des Interfaces WindowListener.

In main wird nur der Konstruktor aufgerufen. Dort wird zunächst versucht die Applikation im javatypischen Look-And-Feel darzustellen. Falls die Wahl des Look-And-Feel mißlingt, wird das Look-And-Feel der zugrundeliegenden Benutzungsoberfläche realisiert. Anschließend wird ein Fensterobjekt JFrame erzeugt und dem Fensterbereich, der für die Darstellung von GUI-Elementen zur Verfügung steht (Content Pane), eine Instanz der Klasse Hello hinzugefügt. Abschließend wird die Größe der Applikation mit der Methode pack berechnet und das Fenster mit der Methode setVisible auf der grafischen Benutzungsoberfläche sichtbar gemacht. Mit dem Aufruf der Methode addWindowListener(this) wird dem Fenster mitgeteilt, daß es selber auf Events reagieren soll, die mit dem Öffnen, Schließen, (De)Aktivieren und (De)Ikonifizieren des Fensters zu tun haben.

Die Klasse HelloApp muß deshalb das Interface WindowListener adaptieren. Der Code enthält die sieben entsprechenden Methoden; die Rümpfe bleiben aber bis auf den von windowClosing leer, da sie hier nicht benötigt werden. Die Methode windowClosing wird aufgerufen, wenn der User auf die ``Fenster schließen''-Schaltfläche des Applikationsfensters geklickt hat. Durch Aufruf von System.exit wird die Applikation sofort beendet.

package HelloWorld;

import java.awt.event.WindowListener;            // Importliste mit allen
import java.awt.event.WindowEvent;               // benoetigten Klassen aus
import java.awt.Dimension;                       // dem AWT und aus den
import java.awt.BorderLayout;                    
import javax.swing.UIManager;                    // Swing-Komponenten
import javax.swing.JFrame;

public class HelloApp implements WindowListener {
  /** Erzeugt eine Instanz der Klasse Hello. */
  public HelloApp() {
    try {                                        // Versuche Look & Feel so zu 
      UIManager.setLookAndFeel(                  // setzen, dass es auf allen 
					         // Systemen gleich aussieht
        UIManager.getCrossPlatformLookAndFeelClassName());
    } catch(Exception e) {};                     // sonst verwende default L&F

    JFrame frame = new JFrame("Hello");          // FensterObjekt erzeugen
                                                 // Instanz der Klasse Hello
                                                 // erzeugen und hinzufuegen
    frame.getContentPane().add(new Hello(), BorderLayout.CENTER);
    frame.addWindowListener(this);               // DIES Objekt ist fuer Window-
                                                 // Events zustaendig
    frame.pack();                                // anzeigbar machen und
                                                 // Fenstergroesse berechnen
    frame.setVisible(true);                      // Fenster sichtbar machen
  }

  /** Die folgenden Methoden gehoeren zum Interface WindowListener. 
   *  Der Rumpf bleibt bei allen Methoden (bis auf windowClosing) leer. */ 
  public void windowActivated(WindowEvent e) { }
  public void windowClosed(WindowEvent e) { }
  public void windowDeactivated(WindowEvent e) { }
  public void windowDeiconified(WindowEvent e) { }
  public void windowIconified(WindowEvent e) { }
  public void windowOpened(WindowEvent e) { }
  /** 
   * Sorgt dafuer, dass die Applikation beendet wird, wenn die entsprechende
   * Schaltflaeche im Rahmen des Fensters gedrueckt wurde.
   * @param e der ausgeloeste Event
   */
  public void windowClosing(WindowEvent e) {
    System.exit(0);                              // Programm sofort beenden
  }

  public static void main(String args[]) {
    new HelloApp();                              // Instanz erzeugen
  }
}


prev up inhalt next