Graphische Oberflächen mit AWT


Grafisches User Interface

Das Graphical User Interface (GUI) verleiht dem Programm das Aussehen eines Windows-Fensters. Auf diesem Windows-Fenster befinden sich Bedienelemente, die der Benutzer mit der Maus oder mit Tastatur-Eingaben ansprechen kann.

Zur Gestaltung der Oberfläche gibt es unterschiedliche Bibliotheken mit grafischen Elementen. In diesem Kapitel werden Elemente aus dem Abstract Windowing Toolkit (AWT) vorgestellt, siehe package java.awt

Eine andere Klassenbibliothek für GUI heisst Swing (hier nicht behandelt), siehe package javax.swing

In Java hat die Gestaltung eines Programms mit GUI 3 Aspekte:

In diesem Kapitel werden die wichtigsten Elemente der GUI vorgestellt: Frame und Button.

Klasse java.awt.Frame

Das folgende Fenster ist abgeleitet von der Klasse Frame

Abbildung Frame1.class Abbildung Frame1.class


import java.awt.Frame;

public class Frame1 extends Frame
{

public Frame1( String Beschriftung )
{
    super( Beschriftung );
}

static public void main(String [] args )
{
    Frame1 f = new Frame1( "1tes Fensterdemo");
    f.setSize( 234, 123);
    f.show();
}
}
Es wurde ein Konstruktor definiert, der für die Beschriftung des Rahmens des Fensters sorgt. In main() wurde dann ein Objekt dieser Klasse Frame1 erzeugt, und dieses wurde mit einer bestimmten Grösse sichtbar gemacht.

Übung:

Man kompiliere das Programm Frame1 in einem geeigneten package. Man teste das Fenster. Weil das Fenster sich noch nicht ausschalten lässt, muss man das Programm auf Betriebssystem-Ebene killen mit <Ctrl>-C.

Klasse java.awt.Button

In den Frame können weitere grafische Elemente eingefügt werden, Bsp Button:

Abbildung Frame2.class Abbildung Frame2.class


import java.awt.*;

public class Frame2 extends Frame
{
    private Button button1 = new Button( "ok");

public Frame2( String Beschriftung )
{
    super( Beschriftung );
    setLayout( new FlowLayout());
    add( button1 );
}

static public void main(String [] args )
{
    Frame2 f = new Frame2( "Fensterdemo mit Button");
    f.setSize( 234, 123);
    f.show();
}
}

Man beachte, dass grafische Elemente nicht direkt auf einen Frame aufgebracht werden können, sondern nur auf ein Layout:
setLayout( new FlowLayout());
add( button1 );
Der Konstruktor der neuen Frame-Klasse ist der richtige Ort, das zu tun.

Übung:

Man kompiliere das Programm Frame2 in demselben package wie die anderen Frames. Man teste das Fenster. Man beachte, dass der Button nichts tut, weil nichts dementsprechendes programmiert wurde.

Maus-Aktionen auf grafischen Elementen

Alle grafischen Elemente, die etwas tun sollen, müssen mit einem Listener-Objekt ausgestattet werden. Das Listener-Objekt ist beim btr. grafischen Element registriert und wird verständigt, sobald der User an dem grafischen Element eine Mausaktion oder eine Tastatur-Eingabe tätigt. Das Listener-Objekt wird in einem solchen Fall aktiv. Alle Listener-Klassen befinden sich im package java.awt.event, das daher importiert werden muss.

ActionListener

Listener-Klassen sind solche, die das interface ActionListener aus dem package java.awt.event implementieren, sie kommen bei den meisten grafischen Elementen zu Einsatz, z.B. für Mausaktionen bei Buttons etc. Die Listener-Klasse wird als innere Klasse realisiert. Der Listener wird beim Button registriert durch die Methode addActionListener() und definiert in seiner actionPerformed()-Methode, was der Listener zu tun hat, wenn der Button angesprochen wurde:

import java.awt.*;
import java.awt.event.*;

public class Frame3 extends Frame
{
    private Button button1 = new Button( "ok");

    class okListener implements ActionListener
    {
        public void actionPerformed( ActionEvent e )
        {
            System.out.print( "ok-Button geklickt" );
        }
    }

    public Frame3( String Beschriftung )
    {
        super( Beschriftung );
        setLayout( new FlowLayout());
        add( button1 );
        okListener ol = new okListener();  //Listener-Objekt erzeugen
        button1.addActionListener( ol );   //bei button1 registrieren
    }

    static public void main(String [] args )
    {
        Frame3 f = new Frame3( "Fensterdemo mit Button und ActionListener");
        f.setSize( 234, 123);
        f.show();
     }
}

Übung:

Man kompiliere das Programm Frame3 in demselben package wie die anderen Frames. Man baue dann ein Fenster mit mehreren Buttons und statte jeden Button mit einem eigenen Listener aus. Wenn dann die unterschiedlichen Buttons gedrückt werden, sollten sie sich im DOS-Fenster mit unterschiedlichen Ausgaben melden.

Wie man bemerken konnte, erzeugt der Kompiler für die innere Klasse eine Class-Datei namens Frame3$okListener.class. Von dieser Klasse wurde das Objekt mit Namen ol erzeugt und beim Objekt button1 registriert:

okListener ol = new okListener();
button1.addActionListener( ol );
Nun ist es nicht immer nötig, dass das Listener-Objekt einen eigenen Namen hat. Es genügt, das Objekt unterwegs zu erzeugen und namenlos zu registrieren. An Stelle der 2 eben zitierten Zeilen genügt die einzige Zeile wie folgt:
button1.addActionListener( new okListener());

Übung:

Man schreibe das Programm Frame3 2te Version mit mehreren Buttons und anonymen Listener-Objekten.

WindowAdapter

Eine andere Form von Listener ist als Adapter-Klasse realisiert. Wenn wir nämlich ein Fenster mittels Mausklick auf die Windowsfenster-Schliessenschaltfläche schliessen wollen, muss bei diesem Fenster ein Listener-Objekt registriert sein, und dieses Listener-Objekt muss mit einer geeigneten Methode zum Schliessen des Fensters und Beenden des Programms ausgestattet sein. Dieses Listener-Objekt muss einer Klasse angehören, die von der Klasse WindowsAdapter abgeleitet wird; diese Klasse ist im folgenden Demo als innere Klasse realisiert:

import java.awt.*;
import java.awt.event.*;

public class Frame4 extends Frame
{
    class WAdapter extends WindowAdapter
    {
        public void windowClosing( WindowEvent e )
        {
            System.exit(0);
        }
    }

    public Frame4( String Bezeichnung )
    {
        super( Bezeichnung );
        WAdapter wa = new WAdapter();
        addWindowListener( wa );
    }

    static public void main(String [] args )
    {
        Frame4 f = new Frame4( "Fenster zum Schliessen");
        f.setSize( 234, 123);
        f.show();
    }
}

Übung:

Man kompiliere das Programm Frame4 in demselben package wie die anderen Frames. Man teste das Fenster. Man beachte, dass das Fenster sich mit der Maus schliessen lässt. Man teste auch <Alt>-F4 usw. Man füge dann einige Buttons und deren Listener hinzu!
Man beobachte, wie der Compiler für die inneren Klassen Dateien erzeugt.


www.AndreasGoedel.de