Graphische Benutzeroberflächen mit Java Swing - Dr. Beatrice Amrhein

Die Seite wird erstellt Diana Rose
 
WEITER LESEN
Graphische Benutzeroberflächen mit Java Swing - Dr. Beatrice Amrhein
Graphische
Benutzeroberflächen mit
      Java Swing
            Teil 1

      Dr. Beatrice Amrhein
Graphische Benutzeroberflächen mit Java Swing - Dr. Beatrice Amrhein
Inhaltsverzeichnis
1 Grundlagen................................................................................................................................................ 4
  1.1 Kurs Überblick..................................................................................................................................... 4
  1.2 Graphik in Java.................................................................................................................................... 5
  1.3 Zeichnen in Java.................................................................................................................................. 7
  1.4 Das Abstract Windowing Toolkit, Java AWT.......................................................................................8
  1.5 Die AWT Komponenten in Java ........................................................................................................... 8
  1.6 Container-Komponenten..................................................................................................................... 10
  1.7 Primitive AWT Komponenten.............................................................................................................. 10
  1.8 Ein AWT Beispiel................................................................................................................................ 11
  1.9 Einfügen von Komponenten................................................................................................................ 11
  1.10 Java Applets.................................................................................................................................... 12
2 Swing....................................................................................................................................................... 13
  2.1 Ein Auszug aus der Klassenstruktur von Swing .................................................................................13
  2.2 Die neuen Möglichkeiten mit Swing .................................................................................................. 14
  2.3 Setzen des Look and Feel................................................................................................................. 15
  2.4 Einfache Swing Komponenten: JLabel, JButton, JCheckBox, ..........................................................16
  2.5 Erzeugen von Menus........................................................................................................................ 18
  2.6 Swing Text Komponenten................................................................................................................. 20
  2.7 Swing Container ................................................................................................................................ 21
  2.8 Window Komponenten....................................................................................................................... 23
  2.9 Anordnen von Interface Komponenten, Java Layout Manager..........................................................23
  2.10 Wie wählt man den Layout Manager................................................................................................ 33
3 Das Java Event Handling......................................................................................................................... 34
  3.1 Key Events......................................................................................................................................... 37
  3.2 Action Events..................................................................................................................................... 38
  3.3 Anonyme Klassen.............................................................................................................................. 39
  3.4 Adapter Klassen................................................................................................................................ 39
  3.5 Mouse Events.................................................................................................................................... 40
  3.6 Events auf Menu Items...................................................................................................................... 41
  3.7 Event Listener mit Parameter............................................................................................................ 41
  3.8 Window Events.................................................................................................................................. 42
  3.9 Die Klasse AbstractAction.................................................................................................................. 43
4 Design Pattern für Graphische Benutzeroberflächen...............................................................................45
  4.1 Das Observer Design Pattern............................................................................................................ 45
  4.2 Das Model View Controller Design Pattern........................................................................................ 49
  4.3 Das Model View Presenter Pattern (MVP)......................................................................................... 54
  4.4 Das Command Processor Design Pattern......................................................................................... 55
  4.5 Drawing Application Beispiel.............................................................................................................. 57
  4.6 Der Swing Undo Manager.................................................................................................................. 59

                                                                                                                                                         2
Graphische Benutzeroberflächen mit Java Swing - Dr. Beatrice Amrhein
1    Grundlagen
1.1 Kurs Überblick

   AWT, das Abstract Windowing Toolkit: Das AWT Paket enthält Klassen um User Interfaces zu erstellen,
    Graphiken zu zeichnen und Bilder darzustellen. Zum Erstellen von User Interfaces stellt das AWT
    grundlegende Komponenten wie Buttons, Labels, Schiebebalken, Windows, ... zur Verfügung.
    Ausserdem können diese Komponenten mittels Event-Handling User-Eingaben verarbeiten und
    weiterleiten.

   Swing, lightweight AWT, aber mit viel mehr Möglichkeiten: Das Swing Paket stellt eine Menge von
    lightweight Komponenten zur Verfügung, welche (so weit wie möglich) auf allen Plattformen gleich
    funktionieren und aussehen. Das Swing Paket bietet im Vergleich zum AWT zusätzlich:
            eine viel grössere Auswahl an GUI Komponenten
            Shortcuts, Accelerators
            wählbares Look and Feel
            verschiedene mächtige Textkomponenten
            Unterstützung von cut, copy, paste, undo, ...
            Tabellen und Bäume
            usw.

   Event Handling: Mit Hilfe von Graphischen Benutzeroberflächen soll der User mit einer Applikation
    interagieren können. Interaktion (mit einem GUI) geschieht über Events. Ein Event ist also eine Aktion,
    welche durch einen Benutzer initialisiert wurde, sei es durch Drücken eines Buttons, Verschieben der
    Maus, Drücken einer Taste ... Wir lernen in diesem Kurs das Java Event Modell kennen und benutzen.

   Design Pattern: Im GUI Bereich sind einige Design Pattern besonders wichtig; dazu gehören das
    Observer Design Pattern (Publisher-Subscriber), das MVC (Model-View-Controller) und das Command
    Processor Design Pattern.

   Spezielle Swing Komponenten wie ComboBoxen (Auswahl-Menü), Listen, Tabellen, Bäume: Swing
    Komponenten sind nach dem MVC Design Pattern aufgebaut. Einige Swing Komponenten sind
    ausserdem adaptierbar, das heisst, Modell, View oder Controller Teile der Komponenten sind
    austauschbar.

   GUI Komponenten sind vorzugsweise Java Beans, das heisst, sie erfüllen das Java Komponenten
    Modell. Dies führt dazu, dass alle GUI Komponenten austauschbar und sehr flexibel einsetzbar sind.

   Die Hauptaufgabe der Software Ergonomie ist es, herauszufinden, wie Benutzeroberflächen gestaltet
    sein müssen, damit die Applikationen
        - anwenderfreundlich,
        - leicht bedienbar,
        - ansprechend und motivierend
    sind.

                                                                                                       3
1.2 Graphik in Java

           Graphics
          ...definiert eine device-unabhängige Schnittstelle
           für Graphikobjekte (Graphik-Kontext).
          ... bietet Methoden für das Zeichnen von Linien,
           Rechtecken, Kreisen, Zeichnen von Bildern, Füllen
           von Flächen, usw.
           drawArc, drawLine, fillOval drawPolygon,
           drawRect, draw3DRect, drawString,
           setColor, setFont, ...

          Verschiedene Plattformen realisieren
           Graphikobjekte auf unterschiedliche Art und
           Weise
                                                                 7

Die Java Klasse Graphics dient als Kontext für alle sichtbaren Objekte in Java.

Graphics Objekte können nicht direkt (durch den Konstruktor erzeugt) werden, da der Konstruktor von
Graphics protected ist.

Wenn eine sichtbare Komponente (Frame, Window, Applet, Button, Label, ...) erzeugt wird, wird jeweils
automatisch ein zugehöriges Graphics Objekt erzeugt,

Von jeder sichtbaren Komponente kann das Graphics Objekt (falls nötig) mit der Methode getGraphics()
           Graphik-Kontext
angefragt werden.

  Jedes Graphik-Objekt kennt seinen Graphik-Kontext.
  Dieser besteht aus den Informationen:

          In welches Fenster (in welche Komponente) das
           Objekt gezeichnet wird
          Die aktuelle Zeichenfarbe
          Der aktuelle Textfont
          Der sichtbare Bereich (clipRect)
          Die aktuelle Pixeloperations-Funktion (XOR oder
           Paint)
  ...
  Die Methode getGraphics() gibt den aktuellen
      Graphik-Kontext zurück.
                                                             8

Das Abfragen der gesetzten Attribute geschieht zum Beispiel mittels der folgenden Befehle:

       •     getGraphics().getColor()
       •     getGraphics().getFont()
       •     getGraphics().getClipBounds()

Allerdings ist es normalerweise nicht nötig, Objekt diese Eigenschaften über das Graphics zu erfragen, da
alle sichtbaren Komponenten eigene entsprechende Methoden besitzen, welche bei ihrem Graphics Kontext
diese Eigenschaften abfragen.

                                                                                                      4
Farben
   Es gibt die vordefinierten Farben

   Color.white, Color.black, Color.blue,
   Color.cyan, Color.darkGray, Color.gray,
   Color.green, Color.lightGray,
   Color.magenta, Color.orange,
   Color.pink, Color.red, Color.yellow

   Daneben können beliebige Farben definiert werden:
        RGB: setzen des Rot-, Grün-, Blau-Anteils
   g.setColor( new Color( 255, 0, 0 ) );

   (g ist das aktuelle Graphics-Objekt)

                                                           9
Farben können entweder über das Graphics Objekt gesetzt werden, oder direkt in der sichtbaren
Komponente. Dafür gibt es die zwei Befehle
    •  setBackground(Color c)
    •  setForeground(Color c)

      Setzen von Fonts

Ein Font besteht aus einem Namen,
dem Style und der Grösse.

  Font   (   "Dialog", Font.PLAIN,
                       Font.PLAIN, 12 );
  Font   (   "DialogInput
             "DialogInput",
                          ", Font.ITALIC,
                             Font.ITALIC, 20 );
  Font   (   "Monospaced
             "Monospaced", ", Font.PLAIN,
                              Font.PLAIN, 18 );
  Font   (   "Serif
             "Serif",
                   ", Font.BOLD,
                      Font.BOLD, 24 );

Das Setzen des Fonts geschieht durch:
  setFont( new Font("Dialog", Font.BOLD, 18 ));

                                                          10
AWT Komponenten kennen nur diese sechs verschiedenen Fonts.
Für Swing-Komponenten stehen sämtliche Systemfonts zur Verfügung. Allerdings ist das Setzen von
„exotischen“ Fonts ergonomisch nicht sinnvoll. Empfohlen wird für Benutzeroberflächen ein schnörkelloser
Font wie SansSerif.

                                                                                                    5
Zeichnen in Java
1.3 Zeichnen in Java
  Zum Zeichnen gibt es in Java die (Graphics-)
    Methoden
    drawLine, drawRect, fillRect, draw3DRect,
    drawOval, fillOval, drawArc, fillArc,
    drawPolygon,  fillPolygon, drawString, ...
           drawOval(x,y,wd,ht)
               (x,y)          wd
                (x, y)

                  ht
                                            height

                             width
                                                          12

Das Zeichnen von Kreisen und Ellipsen ist in Java etwas gewöhnungsbedürftig, da nicht Mittelpunkt und
 Zeichnen in Java
Radien angegeben werden müssen, sondern die linke obere Ecke des umschliessenden Rechtecks, sowie
dessen Breite und Höhe.

 public void paint(Graphics g)
 {
       // Kreise zeichnen
     g.setColor( new Color( 0,80,160 ) );
     g.drawOval( 35,35,110,110 );
     g.fillOval( 40,40,100,100 );
       // Quadrate zeichnen
     g.setColor( Color.white );
     g.drawRect( 60,60,60,60 );
     g.fillRect( 65,65,50,50 );
       // Segment zeichnen
     g.setColor( Color.blue );
     g.fillArc( -25,80,100,100,10,70 );
       // Linien zeichnen
     g.setColor(         Color.red );
     g.drawLine(         25,130,70,30 );
     g.drawLine(         25,130,130,25 );
     g.drawLine(         25,130,140,70 );
 }
                                                                     13

drawLine(x1, y1, x2, y2)
   ... zeichnet eine Linie zwischen den Punkten (x1,y1) und (x2,y2) in der aktuellen Farbe und im
Koordinatensystem des aktuellen Graphik-Kontextes.

drawRect(x, y, wd, ht)
fillRect(x, y, wd, ht)
  ... zeichnet ein (gefülltes) Rechteck an Position (x,y) mit Breite wd und Höhe ht.

drawArc benötigt insgesamt sechs Argumente: die analogen Argumente wie drawOval, plus die zwei
zusätzlichen Argumente Startwinkel und Öffnungswinkel.

                                                                                                    6
Das Koordinatensystem
              (0,0)

                                          x-Achse

                             (4,3)

              y-Achse

Das Koordinatensystem dient zum absoluten Positionieren von14Objekten innerhalb eines Fensters.

Dieses wird zum Beispiel in den Befehlen
   setSize()    (Grösse der Komponente)
   setLocation() (Position der Komponente)
   setBounds() (Grösse und Position)
benutzt

Die Einheiten sind jeweils in Pixel.

1.4 Das Abstract Windowing Toolkit, Java AWT
Die wichtigsten Pakete in java.awt sind:
    • Components: GUI Komponenten wie Buttons, Menus, Labels, Dialog-Boxen, Container, ...
    • Layout Manager: Setzen des Layouts der verschiedenen Komponenten, also arrangieren der
        verschiedenen Komponenten innerhalb ihres Containers
    • Graphics: Methoden für das Setzen von Farben, Fonts, Bilder, Zeichnen von Polygonen, Linien, ...

Das AWT bietet nur relativ primitive Funktionalität und nicht die vollen Möglichkeiten der unterliegenden
Plattform.

Das java.awt Pakage enthält drei Kategorien von Klassen

    •   User Interface Komponenten
    •   Grafik, Hilfsklassen
    •   Layout Managers

Es ist ein plattform-unabhängiges GUI-Toolkit, wird also gleich benutzt unter allen Plattformen (Unix/Linux,
Windows, iOS, ... gleich verwendet.

AWT ist aber plattform-spezifisch implementiert, das bedeutet, es hat ein plattform-abhängiges Look & Feel,
bietet aber nicht alle Möglichkeiten der Plattform (kleinster gemeinsamer Nenner).

                                                                                                        7
1.5 Die AWT Komponenten in Java

Component ist die abstrakte Basisklasse für die in Java angebotenen User Interface Komponenten (ausser
den Menü-Komponenten).
Ein Canvas ist ein Behälter für Zeichnungen oder Bilder. Choice und Listen dienen zum Auswählen von
Optionen. TextArea ist ein Text-Bereich, TextField ist eine Text-Zeile.
Frame und Dialog erzeugen ein eigenes, neues Fenster (toplevel application window).

In Swing gibt es diese Komponenten nochmals als Lightweight-Komponenten. Diese heissen dann JButton,
JLabel, JTextField, JTextArea, JList, JScrollbar ... Ausserdem gibt es in Swing neue Komponenten wie:
JTextPane, JTree JProgressBar, JToolBar, JTable …

paint ist die wichtigste Methode beim Erzeugen von Graphiken.
Die paint-Methode zeichnet die Komponente (Applet, Frame, Panel, ...), mit welcher sie aufgerufen wird.
g ist der Graphik-Kontext.

update zeichnet die AWT-Komponente neu. Dazu wird sie zuerst mit der Hintergrundfarbe gefüllt, dann wird
die (aktuelle) Vordergrundfarbe gesetzt und die paint-Methode der Komponente aufgerufen.

repaint bewirkt, dass (so bald als möglich) die update-Methode dieser Komponente aufgerufen wird.

setVisible(true)/setVisible(false) macht eine Komponente (un-)sichtbar.
Dies muss bei jedem Window (Frame, JFrame, ...) am Ende des Konstruktors aufgerufen werden, um das
Fenster an den Bildschirm zu schicken.

setEnabled(true)/setEnabled(false) erlaubt/verbietet das Aktivieren von Events.
setLocation(), setSize() setzt die Position/ die Grösse der Komponente.

Für alle diese Eigenschaften (size, location, bounds, height, width, ...) gibt es sowohl set- als auch get-
Methoden. So geben getWidth() und getHeight() jeweils die (aktuelle) Breite und Höhe einer Komponente
zurück.

                                                                                                       8
java.awt
           Container Komponenten
1.6 Container-Komponenten
    ... können andere Komponenten enthalten.
    Komponenten
    ... werden eingefügt durch
       add( component )                 am Schluss
       add( component, pos )            an der Position pos
    ... werden gelöscht durch
       remove( component )              einzeln
       removeAll( )                     alle
    ... werden angeordnet durch setzen eines Layout-
       Managers
       setLayout( layoutmgr )
                                                                20

Container Komponenten dienen als Behälter oder Hülle für andere Komponenten. In AWT gibt es die
Container:
• Frame
  ... das Hauptfenster einer Applikation mit
        MenuBar setMenuBar( mb )
        Titel   setTitle( )
        Icon    setIconImage( )

•     Panel
      ... ein Container, der in einen anderen Container platziert wird

•     Dialog, FileDialog
      ... Nebenfenster einer Applikation, für temporäre Informationen

•     Window
      ... ein Fenster ohne Window Dekorationen

1.7 Primitive AWT Komponenten
Button, Canvas, Checkbox, Choice, Label, List, Scrollbar, TextArea und TextField sind primitive AWT
Komponenten. Sie können keine andere Komponenten enthalten.

Sie werden erzeugt durch:
        Button b = new Button("ok");
        Label l = new Label("Hinweise");

Danach können die Komponenten durch

           Panel p = new Panel();
           p.add(b); p.add(l);

in die Container-Komponente p eingefügt werden.

                                                                                                      9
1.8 Ein AWT Beispiel
import java.awt.*;
public class AWTBsp extends Frame {
  public AWTBsp() {
    setFont(new Font( "Serif", Font.BOLD, 16 ));

        // create a panel and add it to the frame
        Panel p = new Panel(); add(p);

        // create a label and add it to the panel
        Label l = new Label ("Name" ); p.add(l);
        // create a textfield and add it to the panel
        TextField t = new TextField(24); p.add(t);
        // create a button and add it to the frame
        Button b = new Button("Quit");
        add(b, BorderLayout.SOUTH);
        // set size and make frame visible
        setBounds(100,100,300,90); setVisible(true);
    }

    public static void main( String argv[] ) {
      AWTBsp awt = new AWTBsp();
    }
}

setFont setzt den zu benutzenden Font für die Applikation (Frame).

Im Konstruktor des Labels kann gleichzeitig der Label-Text (hier “Name”) angegeben werden.
Der Label wird mit p.add(l) in das Panel eingefügt.
Im Konstruktor des Buttons kann auch der Button-Label (hier “Quit“) angegeben werden.
Der Button soll am unteren Rand des Frames (BorderLayout.SOUTH) eingefügt werden.
Zuletzt werden die Grösse und Position des Fensters (setBounds) sowie die Sichtbarkeit (setVisible)
gesetzt.

1.9 Einfügen von Komponenten
public class EasyExam extends Frame {
  private Label l; private Button b;

    EasyExam() {
      Panel p = new Panel();   add(p);         // Erzeugen und Einfügen des Panels.
      setFont( new Font("Dialog",Font.PLAIN, 16));
      l = new Label("Das ist ein Label");
      b = new Button("Das ist ein Button");
      p.add(b); p.add(l);
    }

    public static void main( String argv[] ) {
       EasyExam e = new EasyExam();
       e.setSize(300,90); e.setVisible(true);
    }
}

Die Reihenfolge (Anordnung, Tab-Sequence) der Komponenten hängt nicht davon ab, welche Komponente
zuerst erzeugt wurde, sondern einzig davon, welche Komponente als erstes mit add() eingefügt wurde.

                                                                                                      10
1.10 Java Applets
Applets wurden in Java eingeführt, um Programme in Webseiten laufen lassen zu können. und können mit
dem Benutzer interagieren, ohne Daten zum Server senden zu müssen. Java-Applets waren Ende der
1990er Jahre mit ein Grund für den Erfolg und die schnelle Verbreitung von Java.Üblicherweise werden
Java-Applets von HTML-Seiten aufgerufen. Um sie ausführen zu können, muss der Browser über eine
entsprechende Java-VM verfügen.

Das Einbinden eines Applets in den HTML-Code kann zum Beispiel so aussehen:

Alle Java-Applets werden von der Java-Klasse java.applet.Applet abgeleitet. Sie verfügen über die
Methoden:
    •   init() – wird genau einmal aufgerufen, wenn das Applet erstmals in den Browser geladen wird.
    •   start() – wird jedes Mal aufgerufen, wenn das Applet sichtbar wird.
    •   paint() – die Zeichenmethode des Applet
    •   stop() – wird aufgerufen, wenn das Applet verdeckt wird, z. B. weil das Browser-Fenster
        geschlossen oder von einem anderen Fenster überdeckt wird.
    •   destroy() – wird aufgerufen, wenn das Applet aus dem Hauptspeicher entladen wird.
Applets benötigen keine main()Methode.
Die in die HTML-Oberfläche eingebetteten Fenster können nicht programmgesteuert, sondern nur vom
Benutzer geschlossen werden, man kann aber programmatisch zusätzliche Fenster öffnen.
Ein Beispiel Applet:

public class Animation extends JApplet implements Runnable {
   private int delay, num;
   private Image im[] = new Image[10];
   private Thread animator;

   public void init() {
       delay = 250;num = 0;
       for (int i = 1; i
2     Swing
Im Swing-Paket sind alle Oberflächenkomponenten von JComponent abgeleitet, wodurch diese gleichzeitig
Komponenten und Container sind.

Im Gegensatz zu den AWT-Komponenten sind alle Swing-Komponenten (ausser JApplet, JFrame, JDialog
und JWindow) so genannte Lightweight- Komponenten. Die AWT- Komponenten basieren auf den nativen
dem Betriebssystem zugrunde liegenden GUI-Komponenten und werden nicht wie bei Swing von Java
gezeichnet.

AWT Komponenten haben dabei folgende Eigenschaften:
 Sie liegen auf der z-Achse über den Lightweight-Komponenten.
 Sie haben keine transparenten Bereiche, sind also immer deckend (opaque).
 Sie sind immer rechteckig.

Das Vermischen von Lightweight- und AWT Komponenten kann zu Problemen führen.

Die Anzahl Komponenten wurde in Swing massiv erweitert und hat nicht auf einer A4 Seite Platz.
Alle AWT Komponenten sind in Swing neu implementiert worden und beginnen zur Unterscheidung jeweils
mit einem J.

AWT            Swing

Label         JLabel
Button        JButton

2.1 Ein Auszug aus der Klassenstruktur von Swing

                                                                                               12
2.2 Die neuen Möglichkeiten mit Swing
Mit Swing sind eine ganze Palette von neuen Möglichkeiten in die Java Gui Programmierung eingeflossen.

     •   Keyboard Accelerators
              Alt+F Öffnet das File-Menüs
              Ctrl+C -> Kopiert den selektierten Text, ...
     •   Tool Tips
              Hilfetexte, welche erscheinen, wenn die Maus über der entsprechenden Komponente steht.
     •   Neue LayoutManager, neue Panels
     •   virtuelle Desktops (MDI, d.h. Multiple Document Interface Applikationen)
     •   Drag and Drop
              automatisch in viele Swing-Komponenten eingebauter Data-Transfer Mechanismus.
     •   Undo
              Die Klasse UndoManager unterstützt das Rückgängig-Machen von User Eingaben

Die Klasse JComponent ist die Basisklasse aller Swing Komponenten, ist von (AWT) Container abgeleitet
und erlaubt:
    •   Das Einfügen von Komponenten auch in primitive Swing Komponenten (wie JButton, JLabel, ...)
    •   Das Setzen des Look & Feel (Motif, Window, MacIntosh, Metal, ...) auch zur Laufzeit
    •   Automatisches Double Buffering
Swing-Komponenten
        - sind Lightweight Komponenten
        - basieren auf AWT, d.h. sie sind in AWT implement.

Swing Komponenten könnten zwar beliebig mit AWT Komponenten vermischt werden. Allerdings ist dabei
Vorsicht geboten, da sich Swing und AWT Komponenten nicht gleich verhalten.

Da alle sichtbaren Swing Komponenten von JComponent abgeleitet sind, gibt es keine echten primitiven
Komponenten mehr: in jede Komponente kann jede andere eingefügt werden (mit unterschiedlich
sonderbaren Effekten).

Lightweight Komponenten verwalten sich nicht selber, sondern zeichnen sich bloss in den Hintergrund der
Eltern Komponente.

Vergleich AWT  Swing
Swing-Komponenten werden genau gleich erzeugt und eingefügt wie AWT Komponenten.
Bloss verhalten sich AWT Komponenten anders und sollten darum nicht mehr benutzt werden.

public class Swing extends JFrame {

    Swing() {
      setBackground( Color.white );
      setLayout( new FlowLayout() );
       JLabel hallo = new JLabel("Hello");
       JButton quit = new JButton("Quit");
      add(hallo); add(quit);
    }

    public static void main( String argv[] ) {
       Swing s = new Swing();
       s.setSize(150,70);
       s.setVisible(true);
    }
}

                                                                                                   13
2.3 Setzen des Look and Feel

Das Look and Feel einer Swing Applikation kann (auch zur Laufzeit) ausgetauscht werden.

 UIManager.LookAndFeelInfo laf[] = UIManager.getInstalledLookAndFeels();

gibt die Liste aller verfügbarer Look and Feel zurück.
        Setzen des Look and Feel
Weitere Look and Feel können vom Internet herunter geladen werden.

    try{ // set Look And Feel
      UIManager.setLookAndFeel(
          "javax.swing.plaf.metal.MetalLookAndFeel" );
       // update Component Tree with new Look and Feel
      SwingUtilities.updateComponentTreeUI( this );
    }
    catch( Exception e ) { }
                                                                             ¨

                                                                         8

Beispiel LAFFrame.java unter ~amrhein/Swing/Beispiele/Swing/

                                                                                          14
2.4     Einfache Swing Komponenten: JLabel, JButton, JCheckBox, ...

JLabel
... dienen als Beschriftung und zum Anzeigen von Texten auf der Oberfläche.
... sind sehr vielseitig und können sowohl Texte (sogar HTML) als auch Bilder enthalten.
Die Ausrichtung (Alignment) der Texte und Bilder wird durch SwingConstants definiert.

// by default, the text is aligned left
  l1 = new JLabel("JLabel", SwingConstants.CENTER);

 l1.setFont( new Font( "Dialog", Font.BOLD, 18 ) );
 add( l1 );

 Icon image = new ImageIcon( "icon1.gif" );

  // create new JLabel with text and image
 l2 = new JLabel("Link", image, SwingConstants.RIGHT );

  // set position of label text, relative to image.
 l2.setVerticalTextPosition( SwingConstants.TOP );
   l2.setHorizontalTextPosition(SwingConstants.LEFT);
 add( l2 );

setHorizontalTextPosition( int textPosition ) setzt die horizontale Text-Position, relativ zum Bild des JLabels.
Der Defaultwert ist SwingConstants.RIGHT.

setVerticalTextPosition( int textPosition ) setzt die vertikale Text-Position. Der Defaultwert ist CENTER.

JButton
Mit Hilfe eines Buttons kann der Benutzer ein Event auslösen.
Jeder Button hat eine Beschriftung oder ein Bild zur Erklärung, was für ein Event durch den Button
ausgelöst wird.
In Swing sind alle Komponenten, welche auf Maus Klick ein Event auslösen, von AbstractButton abgeleitet
und haben darum die gleiche Grundfunktionalität.

Wie man zu einem Button ein Event verknüpft, wird im Kapitel „Event Handling“ erklärt.

Verschiedene Button-Methoden sind:
    •   Setzen eines Icon: setIcon(), setPressedIcon(), setRolloverIcon()
            Ein Button kann (abhängig vom Zustand: normal, gedrückt, Mouse_over) verschiedene Bilder
            anzeigen.
    •   Setzen des ButtonLabels: setText("label“)
    •   Setzen eines Hilfetextes (ToolTip): setToolTipText()
            Buttons sollten jeweils einen Hilfetext (ToolTip) ausgeben, welcher dem Benutzer mitteilt, was
            beim Drücken dieses Buttons passieren wird.
    •   Setzen von Shortcuts: setMnemonic()
            Es ist ergonomisch sinnvoll, für alle häufig benutzten Buttons Shortcuts zu definieren.
    •   Auslösen eines Button Event: doClick() simuliert ein Button Klick eines Users.

Hinweis zur Ergonomie: Alle Button-Beschriftungen sind verschieden und ändern sich nicht!
                                                                                                         15
JCheckBox und JRadioButton
Mit Checkboxen und RadioButtons werden verschiedene Optionen ausgewählt. Es können beliebig viele
Checkboxen ausgewählt werden, RadioButtons erlauben nur die Auswahl von einem Element.

JCheckBox(String s)
  erzeugt eine Checkbox mit Label s.

JRadioButton(String s)
  erzeugt ein RadioButton mit Label s.

Ergonomie: Check Boxen und Radio Button sollten dann verwendet werden, wenn nicht mehr als 5 oder 6
Elemente zur Auswahl stehen. Andernfalls sollte eine JList oder ein JComboBox verwendet werden.

Beispiel: CheckboxFrame

class MyPanel extends JPanel
 {
   private JCheckBox cB1, cB2, cB3;
   private JRadioButton rB1, rB2, rB3;
   private ButtonGroup bg;
   private ImageIcon icon1, icon2;

    public MyPanel()
    {
        // erzeugen von CheckBoxen mit Anfangswert (true oder false)
        cB1 = new JCheckBox("Opt1", true);
        cB2 = new JCheckBox("Opt2", false);
        cB3 = new JCheckBox("Opt3", true);
        add(cB1);add(cB2);add(cB3);

        // erzeugen von RadioButtons mit Anfangswert (true oder false)
        rB1 = new JRadioButton("Excl1",true);
        rB2 = new JRadioButton("Excl2",false);
        rB3 = new JRadioButton("Excl3",false);
        add(rB1);add(rB2);add(rB3);

        // Die ButtonGroup sorgt dafür, dass immer bloss ein RadioButton „true“ ist.
        bg = new ButtonGroup();
        bg.add(rB1);
        bg.add(rB2);
        bg.add(rB3);
    }
}

                                                                                              16
JToolbar
Eine Toolbar bietet einen schnellen Zugriff auf die am häufigsten verwendeten Befehle (Actions).
Sie enthält normalerweise vor allem Buttons, kann aber beliebige Komponenten enthalten.
Die Komponenten darauf dürfen nie den Focus behalten
(setFocusable(false).
Die Toolbar kann zur Laufzeit vom Benutzer verschoben
werden.
  public ToolBarDemo() {
      //Create the toolbar.
      JToolBar toolBar = new JToolBar();
      b1 = new JButton(new ImageIcon("left.gif"));
      b1.setFocusable(false); toolBar.add(b1);
      b2 = new JButton(new ImageIcon("right.gif"));
      b2.setFocusable(false); toolBar.add(b2);
      toolBar.addSeparator();
      b3 = new JButton(new ImageIcon("Cut.gif"));
      b3.setFocusable(false); toolBar.add(b3);
      toolBar.add(new JLabel(new ImageIcon("Copy.gif")));
      b4 = new JButton(new ImageIcon("Paste.gif"));
      b4.setFocusable(false); toolBar.add(b4);

      toolBar.addSeparator();
      toolBar.add(new JTextField(15));

      // add toolbar to the frame
       add(toolBar, BorderLayout.NORTH);
  }

2.5     Erzeugen von Menus
JMenuBar() erzeugt einen Menubalken. Dieser wird mit setJMenuBar() in das Frame eingefügt.
JMenu() erzeugt einen Menueintrag, add() fügt diesen in den Menubalken ein.
JMenuItem() erzeugt einen Menubutton. add() fügt diesen in das JMenu ein.
Die Menueinträge können optisch getrennt werden durch addSeparator()

    // create menubar
    JMenuBar bar = new JMenuBar();
    setJMenuBar(bar);

    // create the file menu
    JMenu fileMenu = new JMenu("File");
    JMenu fileMenu.setMnemonic('F');
    JMenuItem quit = new JMenuItem("Quit");
    fileMenu.add(quit);

    // create insert menu
    JMenu insertMenu = new JMenu("Insert");
    JMenuItem insText = new JMenuItem("TextField"); insertMenu.add(insText);
    JMenu insGraph = new JMenu("Graphic"); insertMenu.add(insGraph);
    JMenuItem g1 = new JMenuItem("New"); insGraph.add(g1);
    JMenuItem g2 = new JMenuItem("From File"); insGraph.add(g2);
    JMenuItem g3 = new JMenuItem("AutoForm");   insGraph.add(g3);
    JMenuItem insTab = new JMenuItem("Table");
    insertMenu.add(insTab);

    // add menus to menu bar
    bar.add(fileMenu);
    bar.add(insertMenu);

                                                                                                   17
Anbinden von Shortcuts
Das Aktivieren des File Menus durch 'Alt F' wird ermöglicht
durch:

 JMenu fileMenu = new JMenu("File");
 fileMenu.setMnemonic('F');

'Alt F' ist also ein Mnemonic.

Aktivieren von "Quit" durch 'Ctrl-Q' geschieht durch:
  JMenuItem exitItem = new JmenuItem("Quit");
  exitItem.setAccelerator(
                KeyStroke.getKeyStroke(KeyEvent.VK_Q,Event.CTRL_MASK));

Mnemonics werden unter Windows normalerweise durch die ALT-Taste (zusammen mit einer Doppeltasten-
Kombination) ausgelöst (z. Bsp. ALT-F+A für SaveAs)
Accelerators werden mit CTRL (STRG) ausgelöst, zum Beispiel CTRL-C für copy.

Die gesetzten Shortcuts werden automatisch im JMenuItem (durch Unterstreichen des entsprechenden
Buchstabens oder durch Angabe des CTRL-Strings) angegeben.

JCheckBoxMenuItem und JRadioMenuItem
Checkboxen und RadioButtons gibt es auch als Menu-Items.
Da sie von JMenuItem abgeleitet sind, verhalten sie sich wie normale Menu-Items.
JCheckBoxMenuItem(String text, Icon icon, boolean b)

JRadioButtonMenuItem(String text, Icon icon, boolean selected)

Vorsicht

    •   Nur JCheckBoxMenuItem oder JRadioButtonMenuItem und
        keine JCheckBox oder JRadioButton Kompontenten in das
        Menu einfügen, andernfalls funktioniert das Popup-Menu
        nicht richtig.
    •   Genau wie die JRadioButton benötigen auch die
        JRadioButtonMenuItem Komponenten eine Button-Group,
        damit nur immer genau eine Komponente der Gruppe
        gleichzeitig selektiert ist.

                                                                                              18
2.6     Swing Text Komponenten
In Swing gibt es die folgenden Text-Komponenten:

JTextArea ist ein einfacher Text Bereich ohne Formatierung. JTextField ist ein einzeiliger Text Bereich.
Ein JPasswordField verbirgt den Text hinter einem Zeichen (typischerweise “*“).
JFormattedTextField ermöglicht durch Angeben einer entsprechenden Maske formatierten Text einzugeben
(Telefon-Nummern, Währungen, ...).

Ein JEditorPane kann Plain-Text, HTML-Text oder RTF-Text darstellen.

Ein JTextPane kann verschiedene Formatierungen (Farben, Fonts, Styles, ...) und auch Bilder darstellen.

In einem Text Bereich können verschiedenste Typen von Events abgefangen werden: KeyEvent,
CaretEvent, FocusEvent... Jede Text Änderung in einem Text Bereich erzeugt ausserdem ein
DocumentEvent.

Bei einem JTextField kann auch ein ActionEvent abgefangen werden. Dies wird durch das Drücken der
Enter-Taste ausgelöst.

Die Editierbarkeit von Text Bereichen kann durch setEditable(true/false); gesetzt werden

   text1 = new JTextField("TextField Demo");

   text1.setEditable( false );
   add(text1, BorderLayout.NORTH);

   // text area in scroll pane
   text2 = new JTextArea();
   add(new JScrollPane(text2));

   // editable text field
   text3 = new JTextField();
   add(text3, BorderLayout.SOUTH);

Das Setzen von verschiedenen Formatierungen (Farben, Styles, ...) in Text Komponenten behandeln wir im
Kapitel „Spezielle Swing Komponenten“

Der Text Bereich muss in ein JScrollPane eingefügt werden, damit er einen Schiebe-Balken (Scrollbar)
bekommt.

                                                                                                   19
2.7 Swing Container
Alle Swing Komponenten sind Container:
   JButton hbutton = new JButton("Hintergrund Button");

    // set layout manager
    hbutton.setLayout(new BorderLayout());

    // insert swing label
    JLabel oben = new JLabel("Oben");
    hbutton.add(oben, BorderLayout.NORTH);

    // insert awt label
    Label unten = new Label("Unten");
    hbutton.add(unten, BorderLayout.SOUTH);

Alle Swing-Komponenten sind (abgeleitet von der Klasse) AWT-Container.
Das bedeutet, dass in Swing nicht nur Container-Komponenten sondern jede Swing Komponente andere
Komponenten (sogar AWT-Komponenten) enthalten kann (mit dem entsprechenden seltsamen Verhalten).

JPanel
JPanel sind die einfachsten Swing Container. Sie dienen vor allem
dazu, andere Container (in logisch zusammengehörige Teile) zu
unterteilen.

JPanel sind unsichtbar. Wir können sie nur sehen, wenn wir einen
anderen Hintergrund oder (wie hier) einen Rahmen (Border)
setzen.

class MyBorderFrame extends JFrame
{
  public MyBorderFrame()
  {
    //Create the panels
    Jpanel p1 = new JPanel();
    p1.setBorder( new TitledBorder(new LineBorder(Color.blue), "Main Workspace"));
    add(p1, BorderLayout.CENTER );

        Jpanel p2 = new JPanel();
        p2.setBorder(new TitledBorder(new LineBorder(Color.red), "Utilities"));
        add(p2, BorderLayout.NORTH);

        Jpanel p3 = new JPanel();
        p3.setBorder(
                 new TitledBorder(new LineBorder(Color.black), "Auxilary Informations"));
        add(p3, BorderLayout.SOUTH);
    }

}

                                                                                           20
JSplitPane und JTabbedPane
SplitPane und TabbedPane sind weitere nützliche Swing Panels.

Ein SplitPane enthält verschiebbare Teiler-Balken zum
Vergrössern/Verkleinern der verschiedenen Bereiche. SplitPanes
werden erzeugt durch:
JSplitPane( int unterteilung,
            Component leftComponent,
            Component rightComponent)

Es gibt die Unterteilungen:
   VERTICAL_SPLIT         oben/unten
   HORIZONTAL_SPLIT rechts/links

Ein JTabbedPane ist eine Komponente, mit welcher der Benutzer zwischen verschiedenen Komponenten
umschalten kann. Dies geschieht durch Drücken des entsprechenden Kartenreiters.

     JTabbedPane tabbedPane = new JTabbedPane();
     tabbedPane.addTab(" 1 ", new JPanel());
     tabbedPane.addTab(" 2 ", new Jbutton("This is Pane 2"));
     . . .
     tabbedPane.setTabPlacement(SwingConstants.TOP);

Beispiele: MySplitPane.java
           MyTabbedPane.java unter ~amrhein/Swing/Beispiele/SwingContainer

2.8 Window Komponenten

Die Komponenten Dialog, Frame, JWindow, JDialog
und JFrame sind von Window und nicht von
JComponent abgeleitet. Diese Komponenten sind
nicht lightweight.

Lightweight Komponenten sind in Java implementiert
und sind darum unabhängig vom unterliegenden
Betriebssystem. Dies funktioniert nicht für die
Komponenten, welche ein neues Fenster erzeugen,
da diese mit dem Window-Manager (Betriebssystem) interagieren müssen. Alle Fenster-Komponenten (von
Window abgeleitet) sind darum nicht Lightweight.

                                                                                             21
2.9 Anordnen von Interface Komponenten, Java Layout Manager

Es gibt grafische Benutzeroberflächen, bei denen die Anordnung der Komponenten über die Angabe
absoluter Koordinaten erfolgt. Diese Vorgehensweise ist aber aus mehreren Gründen nicht zu empfehlen:
       Absolute Angaben sind sehr unflexibel. Beim Einfügen weiterer Komponenten müssen die
        Positionen anderer Komponenten angepasst werden, was mit erheblichem Aufwand verbunden sein
        kann. Die Layout-Manager nehmen dem Benutzer die Arbeit der absoluten Positionierung ab. Der
        Benutzer macht lediglich qualitative Angaben wie „diese Komponente soll links von einer anderen
        stehen“ oder „alle Komponenten sollen untereinander stehen“.

       Durch Verwenden eines Layout Manager braucht sich der Benutzer auch nicht um die Grösse der
        Komponente zu kümmern. Jede Java-Komponente besitzt die Methode getMinimumSize() und
        getPreferredSize() zum Bestimmen der Mindestgrösse bzw. der bevorzugten Grösse der
        Komponente. Bei Buttons und Labels richten sich diese beispielsweise nach der Breite des Textes,
        mit dem sie beschriftet sind. Wenn der Layout-Manager einen Container bearbeitet, berücksichtigt
        er die Rückgabewerte dieser Methoden bei allen enthaltenen Komponenten. Mit diesem
        Zusammenspiel wird dem Benutzer die Festlegung der Grösse von Komponenten erspart.

       Durch die Vermeidung absoluter Grössenangaben ist es möglich, dass eine Komponente ihre
        Grösse beim Verändern der Container-Grösse anpassen kann. So kann zum Beispiel ein Text-
        Bereich stets das gesamte Fenster ausfüllen, in das es eingebettet ist.

Der grösste Nachteil von absoluten Koordinaten ist, dass das Erscheinungsbild eines Fensters auf
verschiedenen Plattformen stark variieren kann. Ein häufiger Effekt ist beispielsweise ein Abschneiden des
Textes von Eingabefeldern, wenn die Oberfläche unter einem anderen Betriebssystem oder mit einer
anderen Bildschirm-Auflösung entworfen wurde.

        Die wichtigsten Layout Manager
            
                    FlowLayout
                                      FlowLayout

                                    BorderLayout
                                    BorderLayout

                                     BoxLayout
                                     BoxLayout

                                     CardLayout
                                     CardLayout

                                     GridLayout
                                     GridLayout

                                    GridBagLayout
                                    GridBagLayout

  LayoutManager bestimmen die Position und eventuell auch die
  Grösse der im Container enthaltenen Komponenten

                                                             35
In AWT gibt es fünf verschiedene Layout Manager: FlowLayout, BorderLayout, CardLayout, GridLayout und
GridBagLayout.
In Swing gibt es noch einige weitere Layout Manager, welche zum Teil vor allem intern (also für die Swing
Komponenten selber) gebraucht werden.
Alle Layout Manager können sowohl für AWT wie auch für Swing Komponenten benutzt werden.

                                                                                                     22
FlowLayout
    Der LayoutManager bestimmt die Position und
     eventuell auch die Grösse der im Container
     enthaltenen Komponenten

    FlowLayout ...
     ... ist geeignet für einfache Anwendungen
     ... positioniert zeilenweise

Im FlowLayout werden die einzelnen Komponenten zeilenweise, wie Wörter in einem Text, angeordnet: von
links nach rechts und zeilenweise von oben nach unten. Die einzelnen Komponenten können nach links,
nach rechts oder in der Zeile zentriert angeordnet werden. 36

Die Komponente JPanel hat per Default ein FlowLayout als Layout Manager.

        Verwenden des FlowLayout
                                                              Der Konstruktor von FlowLayout hat die
                                                              Parameter
    FlowLayoutBsp (){                                               alignment
     // set layout manager and font                                 horizontal spacing
     setLayout(                                                     vertical spacing
     new FlowLayout(FlowLayout.LEFT,5,5));
     // create a label and add it to the panel
     l = new JLabel("Press Button to Quit" );
     add( l );
     // create a button and add it to the panel
     b = new JButton( "Quit" );
     add( b );
}
public class FlowLayoutBsp extends JFrame
{
  FlowLayoutBsp()                                37

  {
    // set layout manager
    setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));           // linksbündig mit jeweils 5 Pixel
                                                                // Abstand zwischen den Komponenten
      // create a label and add it to the panel
      JLabel l = new JLabel("Press Button to Quit");        add(l);

      // create two buttons and add them to the panel
      JButton b1 = new JButton("Cancel"); add(b1);    // add bestimmt die Reihenfolge der Button
      JButton b2 = new JButton("Quit");   add(b2);

    }
    . . .
}

                                                                                                 23
BorderLayout
        ... ist geeignet für Hauptfenster
        ... verwaltet Grössen und Positionierung
        ... erzeugt einen grossen Zentralbereich Center
        ... und vier schmale Randbereiche                      NORTH      PAGE_START
                                                               SOUTH      PAGE_END
             North, West, South, East                          WEST       LINE_START
                                                               EAST       LINE_END

                                                          38

public class BorderLayoutBsp extends JFrame
{
  BorderLayoutBsp()
  {
    // create panel with border layout, put 5 pixel between every component
    JPanel p = new JPanel(new BorderLayout(5, 5));

        p.setBackground(Color.white);
        add(p);

        // create all buttons and add them to the panel
        JButton center = new JButton("Center");
        p.add(center, BorderLayout.CENTER);
        JButton north = new JButton("North");
        p.add( north, BorderLayout.PAGE_START );
        JButton south = new JButton("South");
        p.add(south, BorderLayout.PAGE_END);
        JButton west = new JButton("West");
        p.add(west, BorderLayout.LINE_START);
        JButton east = new JButton("East");
        p.add(east, BorderLayout.LINE_END);

        north.setFont(new Font("Courier", Font.BOLD, 18));
        west.setFont(new Font("Courier", Font.BOLD, 16));
    }

}

                                                                                              24
Der Konstruktor von GridLayout hat die Parameter:
    •  Anzahl Zeilen der Tabelle
    •  Anzahl Spalten der Tabelle
    •  Horizontaler Abstand zwischen den Komponenten
    •  Vertikaler Abstand zwischen den Komponenten

public class GridLayoutBsp extends JFrame
{
  GridLayoutBsp()
  {
    // set layout manager
    setLayout(new GridLayout(0, 2, 5, 5));

     // create two labels and add them to the panel
     JLabel l = new Jlabel("Press Button to Quit");
     add(l);
     add( new JLabel() ); // add empty label to fill empty space

     // create two s and add them to the panel
     JButton b1 = new JButton("Cancel"); c.add(b1);
     JButton b2 = new JButton("Quit");   c.add(b2);

  }
 . . .

}

Vollständige Beispiele unter
http://www.sws.bfh.ch/~amrhein/Swing/Beispiele/Layout/

                                                                   25
Im CardLayout sind alle eingefügten Komponenten so gross wie der Container, in welchem sie enthalten
sind. Nur jeweils die „oberste“ Komponente ist sichtbar.
Durch die Methoden show(), first(), last(), next() und previous() wird zwischen den verschiedenen Ansichten
navigiert.

public class MyCardLayout extends JFrame
{
  JPanel parent;
  CardLayout layout = new CardLayout();
  Font font = new Font("Dialog", Font.BOLD, 16);

    public MyCardLayout()
    {
      parent = new JPanel( layout );
      add(parent);

        // create content    of cards
        MyJPanel p1 = new    MyJPanel(Color.green, 1); parent.add(p1, "1");
        MyJPanel p2 = new    MyJPanel(Color.yellow, 2); parent.add(p2, "2");
        MyJPanel p3 = new    MyJPanel(Color.red, 3); parent.add(p3, "3");
    }

 class MyJPanel extends JPanel
  {
    MyJPanel(Color color, int c)
    {
      setLayout(new GridLayout(2,1));
      setBackground(color);
      JLabel l1 = new JLabel("This is Card " + c, SwingConstants.CENTER);
      l1.setFont(font); add(l1);
      JLabel l2 = new JLabel("Click Mouse to switch to card " + (c%3+1));
      add(l2);

            addMouseListener(new MouseAdapter() {
              public void mouseClicked(MouseEvent e)
              { layout.next(parent); }
            });
        }
    }
}

                                                                                                     26
GridBagLayout
...   ist geeignet für komplexe Anordnungen
...   verwaltet Grösse und Position
...   basiert auf Zeilen und Spalten
...   passt die Grösse von Zeilen / Spalten dynamisch an

Jede Komponente kann
       ... eine oder mehrere Zellen belegen
       ... ihren Bereich ganz oder nur teilweise ausfüllen
       ... bei Änderung der Container Grösse
          unterschiedlich stark wachsen

                                                           41
Das GridBagLayout ist das flexibelste, aber auch das komplizierteste   der fünf AWT Layouts.
Der Container wird in ein Gitter von Zeilen und Kolonnen unterteilt. Diese müssen nicht gleich hoch/breit
sein. Jede Komponente wird positioniert durch Setzen verschiedener Variablen aus GridBagContraints.

Das GridBagLayout bietet unter anderem folgende Möglichkeiten:
   Eine Komponente kann sich über mehrere Gitterzellen erstrecken.
   Spalten und Zeilen können unterschiedlich breit bzw. hoch sein.
   Eine Komponente kann die ihr zugewiesenen Gitterzellen voll ausfüllen oder nur zum Teil.
   Bei Grössen Änderungen des Containers kann angegeben werden, zu welchen Anteilen die
    Höhen-/Breiten Änderung auf die einzelnen Gitterzeilen und -spalten verteilt wird.
Die Einstellung dieser Eigenschaften erfolgt mit Hilfe der Klasse GridBagConstraints.
   GridBagConstraints.gridwidth/GridBagConstraints.gridheight definiert die Anzahl
    Gitterzellen, über die sich die Komponente horizontal/vertikal erstreckt. Möglich sind die Werte
       Absoluter Wert: Anzahl Gitterzellen.
       GridBagConstraints.REMAINDER vergibt den Rest der aktuellen Zeile an die Komponente.
       GridBagConstraints.RELATIVE platziert die nächste oder die zweitletzte Komponente.
   GridBagConstraints.gridx/ GridBagConstraints.gridy positioniert die Komponente in der
    Gitterzelle gridx/gridy.
   GridBagConstraints.anchor erlaubt die Festlegung der Position einer Komponente innerhalb ihres
    Anzeigebereichs, falls sie diesen nicht voll ausfüllt.
       Mögliche Werte sind GridBagConstraints.CENTER sowie acht Richtungskonstanten:
        GridBagConstraints.NORTH bis GridBagConstraints.NORTHWEST.
   GridBagConstraints.fill spezifiziert, ob und wie die Komponente ihren Anzeigebereich ausfüllt:
       GridBagConstraints.NONE: Die Komponente erhält ihre bevorzugte Grösse.
       GridBagConstraints.HORIZONTAL: Die Komponente füllt die Horizontale
       GridBagConstraints.VERTICAL: Die Komponente füllte die Vertikale
       GridBagConstraints.BOTH: Die Komponente füllte den ganzen Bereich (Default).
   GridBagConstraints.weightx / GridBagConstraints.weighty : ermöglichen eine gewichtete
    Verteilung des vorhandenen Platzes auf die einzelnen Gitterzellen.
   GridBagConstraints.insets fügt an den Rändern des Bereichs zusätzlichen Zwischenraum ein.

Vollständige Beispiele unter
http://www.sws.bfh.ch/~amrhein/Swing/Beispiele/Layout/

                                                                                                      27
Mit der Einführung von Swing wurden auch einige neue Layout Manager entwickelt: BoxLayout,
GroupLayout und SpringLayout. Das SpringLayout ist dazu gedacht, in GUI-Builder eingesetzt zu werden.

Das BoxLayout wurde entwickelt, um ähnliche Ergebnisse wie beim GridBagLayout zu erhalten, ohne
dessen Komplexität übernehmen zu müssen. Es ordnet Komponenten entlang einer vorgegebenen Linie an,
wobei folgende Möglichkeiten zur Verfügung stehen:
  X_AXIS: Die Komponenten werden horizontal von links nach rechts ausgelegt.
  Y_AXIS: Die Komponenten werden vertikal von oben nach unten ausgelegt.
  LINE_AXIS: Horizontal, aber abhängig von der ComponentOrientation des Containers.
  PAGE_AXIS: Abhängig von der ComponentOrientation (horizontal, vertikal, rechts, links).

Das BoxLayout versucht, die Komponenten gemäss der preferredSize anzuordnen. Füllen die Komponenten
nicht den gesamten zur Verfügung stehenden Platz aus, wird die Ausrichtung durch das alignmentX bzw.
alignmentY der Komponenten bestimmt.
Um die Verwendung des BoxLayout zu vereinfachen, gibt es die Klasse Box, die eine Komponente mit
einem BoxLayout darstellt
Neben den oben erwähnten Möglichkeiten des BoxLayouts bietet die Box drei Konstrukte, um unsichtbare
Komponenten zur Ausrichtung zu verwenden:
   Rigid Area: Eine unsichtbare Komponente mit fixer Grösse.
   Glue: Ein Glue kann entweder horizontal oder vertikal ausgerichtet sein und nimmt sämtlichen
    überschüssigen Platz ein.
   Box.Filler: Ein Box.Filler ist eine nach eigenen Angaben gestaltete, flexible unsichtbare Komponente,
    welche sich gemäss der angegebenen Dimension skaliert.

                                                                                                  28
Jede Gruppe besetzt eine Tabellen-Zelle. Komponenten werden zuerst zeilenweise, dann spaltenweise
zugeordnet.

AdressPanel() {

     GroupLayout layout = new GroupLayout(this);
     this.setLayout(layout);
     layout.setAutoCreateGaps(true);
     layout.setAutoCreateContainerGaps(true);

     layout.setHorizontalGroup(layout.createSequentialGroup()                  // Definition der
       .addGroup(layout.createParallelGroup(TRAILING).                         // Spalten
             .addComponent(name)
             .addComponent(geschlecht)
             .addComponent(strasse)
             .addComponent(gebDatum))

               . . .
          );

     layout.setVerticalGroup(layout.createSequentialGroup() // Definition der
             .addGroup(layout.createParallelGroup(BASELINE)   // Zeilen
             .addComponent(name)
             .addComponent(nameField)
             .addComponent(vorname)
             .addComponent(vornameField))
       // . . . analog
       );
}

                                                                                               29
Forms Layout Manager
    Der JGoodies Forms Layout Manager kann
     ebenfalls sehr komplexe Anordnungen
     verwalten, ohne dass der Code durch viele
     Platzierungs-Anweisungen belastet wird.

Der Layout Manager von JGoodies http://www.jgoodies.com/ bietet eine ähnliche Flexibilität wie ein
GridBagLayout, „verschmutzt“ den Code aber viel weniger durch Platzierungs-Anweisungen. Die
Initialisierung geschieht in einem (etwas komplizierten) Konstruktor, danach werden die Komponenten
einfach der Reihe nach in die Zeilen eingefügt.

public LayoutTest()
{
                                              45
  FormLayout layout = new FormLayout(
     "right:max(40dlu;pref), 3dlu, fill:max(4dlu;pref), 2dlu,
        right:max(10dlu;pref), 2dlu, 27dlu:grow, 7dlu, " + // 1st major column
     "right:max(40dlu;pref), 3dlu, 80dlu:grow", // 2nd major column
     "");                                        // add rows dynamically

    DefaultFormBuilder builder = new DefaultFormBuilder(layout);
    builder.setDefaultDialogBorder();
    builder.appendSeparator("Adresse");

    builder.append("Name", new JTextField(20), 5);
    builder.append("Vorname", new JTextField());
    builder.nextLine();

    builder.append("Strasse", new JTextField(), 5);
    builder.nextLine();

    builder.append("PLZ", new JTextField(4));
    builder.append("Ort", new JTextField(10));
    String[] str = {"Schweiz","Deutschland"};
    builder.append("Land", new JComboBox(str));
    builder.nextLine();

    builder.appendSeparator("Versand");

    ...

}

Vollständiges Beispiel unter
http://www.sws.bfh.ch/~amrhein/Swing/Beispiele/Layout/

                                                                                                  30
2.10 Wie wählt man den Layout Manager

In erster Linie soll nicht das Aussehen die Anzahl verwendeter Container bestimmen, sondern die
Anwendung. Versuchen Sie also nicht, verschiedenste Probleme in der gleichen Panel-Klasse zu lösen, nur
weil deren Ausgabe auf der Oberfläche nebeneinander zu liegen kommen muss. Verwenden Sie lieber
mehrere Panels, um die Oberfläche sauber zu gruppieren und versuchen Sie nicht, das ganze Layout auf
einen Schlag zu organisieren.

Wir betrachten anhand verschiedener Szenarios verschiedene Lösungsmöglichkeiten.

   1. Es gibt eine Hauptkomponente, welche so viel Platz wie möglich einnehmen soll. --> BorderLayout,
      einfügen im CENTER. Die restlichen Komponenten an den Rändern.
   2. Es gibt eine Anzahl Komponenten, welche in einer Zeile (oder Spalte) alle gleich gross angeordnet
      werden sollen. --> GridLayout.
   3. Die Komponenten sollen alle jeweils so klein wie möglich in einer Zeile dargestellt werden.--> ein
      JPanel mit FlowLayout.
   4. Es gibt eine Anzahl Komponenten, welche in einer Zeile (oder Spalte) angeordnet werden sollen, sie
      sind nicht alle gleich gross, oder sie haben verschieden grosse Abstände --> BoxLayout, ev. durch
      Zuhilfenahme von unsichtbaren Komponenten für die grossen Abstände.
   5. Die Komponente muss je nach Zustand (oder Benutzereingabe) verschiedene, vielleicht
      unterschiedlich grosse oder eine verschiedene Anzahl von Komponenten anzeigen. --> CardLayout.
      Dabei gibt es pro Zustand je eine Karte.
   6. Die Komponente beinhaltet ein Formular (Name, Vorname, Adresse, ...plus je ein TextFeld). -->
      SpringLayout, FormsLayout(JGoodies) GridBagLayout oder eigener Layout Manager.
   7. Die Komponente enthält verschiedenste Komponenten, welche unterschiedlich gross sind und
      unterschiedlich stark wachsten sollen. --> Aufteilen in verschiedene Panels, welche verschiedene
      Layout Manager benutzen, FormsLayout oder GridBagLayout.
   8. Relativ einfaches Layout, welches aber durch keinen Layout Manager optimal verwaltet wird -->
      eigenen Layout Manager schreiben.

                                                                                                     31
3    Das Java Event Handling
Die Interaktion mit einem GUI geschieht über Events. Ein Event ist eine Aktion, welche durch einen
Benutzer initialisiert wurde, sei es durch Drücken eines Buttons, Verschieben der Maus, Drücken einer
Taste ...
Damit Java auf die Aktion eines Benutzers reagiert, muss zuerst ein Event Listener registriert und ein
zugehöriger Event Handler implementiert werden.

Damit ein Event Listener über die eingegangenen Events benachrichtigt wird, muss er sich bei der
entsprechenden Event Source registrieren. Dies geschieht durch Aufruf der addXXXListener-Methode,
wobei »XXX« jeweils für den entsprechenden Event-Typ steht.

        Auszug aus dem java.awt.event Package

                             Die wichtigsten AWT Events
        AWTEvent

             ActionEvent
           AdjustmentEvent
                                  FocusEvent
           ComponentEvent                         KeyEvent
                                  InputEvent
                                                 MouseEvent
                                  PaintEvent
                                 WindowEvent
                                               MouseWheelEvent

                                                                 4

Alle AWTEvent-Objekte bieten die Methoden
             isConsumed() liefert true, falls das Event bereits verarbeitet wurde
             consume(): verarbeitet (löscht) das Event, falls möglich.
             getID(): liefert die ID des Ereignisses
             getSource(): gibt die EventSource zurück.

                                                                                                     32
Jeder Event-Klasse entspricht ein Listener Interface.

        Die entsprechenden EventListener

                                    >
                                  >

                                 >

                  >

                                     >
                                    >
                                  
                                                       >>
                                    
                                                             5

Jeder Event Listener ist spezialisiert auf gewisse Arten von Events (Mouse Event, Key Event, Action
Event ...). Der Event Handler ist dann die Methode, welche beim Eintreffen des entsprechenden Events
ausgeführt wird.

        Auszug aus dem Swing Event Package

                EventObject

                                         CaretEvent
                                        ChangeEvent
                                    ListSelectionEvent
                                        MenuEvent
                                        MenuEvent
      Die wichtigsten Klassen
                                     TableModelEvent
       aus javax.swing.event
                                     TreeModelEvent
                                    UndoableEditEvent
                                    UndoableEditEvent

                                                             6

Dies sind die wichtigsten Events, welche mit dem Swing Paket neu verfügbar sind.
Für die Swing Komponenten können aber auch die üblichen AWT-Events verwendet werden.

                                                                                                  33
Sie können auch lesen