19 Eine GUI-Klasse für die Fachklasse Mathematik
19.1 Ein- und Ausgabefenster
 
GUI GUI (= Grafical User Interface) ist ein Klasse oder Programm, das die grafische Oberfläche für andere Programme (of Fachklassen genannt) bietet. Diese grafisch gestalteten Oberflächen kann man als Schnittstelle zwischen Bediener und den Fachklassen verstehen. Der in unserem Kurs verwendete Javaeditor stellt per Mausklick ein Programmgerüst für eine GUI zur Verfügung.
 
Gerüst
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

#1  public class EinUndAusgabe extends JFrame {
#2   // Anfang Variablen
#3   // Ende Variablen

#4   public EinUndAusgabe (String title) {
       // Frame-Initialisierung
#5     super (title);
#6      addWindowListener(new WindowAdapter() {
#7        public void windowClosing (WindowEvent evt) {
#8         System.exit(0);
#9        }
#10     });
#11    setSize(300, 300);
#12    Container cp = getContentPane();
#13    cp.setLayout(new BorderLayout());

       // Anfang Komponenten

       // Ende Komponenten

#14    setVisible(true);
#15  }

     // Anfang Ereignisprozeduren
     // Ende Ereignisprozeduren

#16  public static void main (String[] args) {
#17    new EinUndAusgabe("Ein- und Ausgabe");
#18  }
#19 }

 

Erläuterungen

Die GUI wurde als JFrame aus dem Paket javax.swing angelegt. Mit

import javax.swing.*;

werden alle Klassen aus dem Paket javax.swing zur Verfügung gestelt. Da aber JFrame Eigenschaften von Frame aus dem Paket java.awt enthält - wir sagen später 'erbt' - muss über import java.awt.*; dieses Pakte zur Verfügung gestellt werden. Auf den dritten Import werden wir später zurückkommen. Wir werden unsere GUI also als Swing-Klasse programmieren.  Einige Bemerkungen zum restlichen Gerüst wollen wir aber schon jetzt machen, auch wenn wichtige Details erst deutlich werden, wenn wir uns intensiver mit OOP beschäftigen:

In den Zeilen #4 bis #15 wird der sog. Konstruktor angelegt, der in Zeile #17, also in der main-Methode aufgerufen wird. Im Konstruktor ist all das festgelegt, was die sog. Instanz unseres Programms nach ihrer Erzeugung alles hat und können soll. So bekommt der Fensterrahmen in der Zeile #5 einen Namen, der dem Konstruktor bei seinem Aufruf in Zeile #17 übergeben wird. Das Fenster wird also den Titel "Ein- und Ausgabe" haben. In den Zeilen #6 bis #10 wird das ordentliche Schließen des Fensters organisiert, das dann geschehen soll, wenn der Bediener das Kreuzbutton in der rechten oberen Ecke des Fensters anklickt. In #11 bekommt das Fenster eine quadratische Form mit der Seitenlänge von 300 Pixel. Schließ wird in den Zeilen #12 und #13 ein Container angelegt, der die grafischen Komponenten - sie müssen erst noch angelegt werden - aufnimmt. Dieser Container bekommt mit der Methode getContentPane() Informationen über das grafische Umfeld des Rechners und der Bildschirmeinstellung. Dieser Container, cp genannt, wird noch mit einem Layout, dem Borderlayout versehen.

BorderLayout

Dieses BorderLayout teilt den Container in 5 Regionen: Norden, Westen, Süden, Osten und Zentrum. Wie diese Regionen angeordnet sind, zeigt das nachstehende Bild.

In die aufzeigten Regionen lassen sich Buttons, Textfelder und vieles mehr einfügen. Ja man kann den einzelnen Regionen weitere Layouts zufügen und sie in ihrer Größe verändern, so dass der Flexibilität kaum Grenzen gesetzt sind.

In unserem Programm wollen wir im  Norden und Süden jeweils ein Textfeld und im Zentrum ein Button unterbringen. Da die Regionen Westen und Osten nicht besetzt sind, verschwinden sie.

 

Zufügen von Grafikobjekten

Wir deklarieren also zwischen den Zeilen #2 und #3:

  private JTextField eingabeFeld, ausgabeFeld;
  private JButton rechenButton;

Initialisiert, wir sagen jetzt lieber instanziiert, werden sie im Konstruktor, dort wo für Komponenten Platz gehalten ist:

    // Anfang Komponenten
    eingabeFeld = new JTextField("Eingabe einer Zahl");
    eingabeFeld.setHorizontalAlignment(eingabeFeld.RIGHT);
    cp.add(eingabeFeld,BorderLayout.NORTH);

    rechenButton = new JButton("Fakultät[n]");
    cp.add(rechenButton,BorderLayout.CENTER);

    ausgabeFeld = new JTextField();
    ausgabeFeld.setHorizontalAlignment(ausgabeFeld.RIGHT);
    cp.add(ausgabeFeld,BorderLayout.SOUTH);
    ausgabeFeld.setEditable(false);
    // Ende Komponenten

1. Grafik-Objekt: eingabeFeld
Es wird instanziiert und dabei mit einem Vorgabetext, nämlich "Eingabe einer Zahl" versehen. Der Code in der zweiten Zeile sorgt dafür das der Text in dem Textfeld rechtsbündig dargestellt wird. schließlich wird das Grafikobjekt in die Region Norden des Containers angelegt.

2. Grafikobjekt: rechenButton
Nach seiner Instanziierung wird es im Zentrum des Containers platziert.

3. Grafikobjekt: ausgabeFeld
Es analog zum
eingabeFeld konstruiert. Einzige kleine Abweichung: In der letzten Zeile, wird dafür gesorgt, dass der Bediener keine Eintragungen in dieses Feld vornehmen kann.

Wir verändern noch die Zeile #11. Statt der vorgegebenen Größe für das das Grafikfenster, setzen wir es mit setSize(200,100) auf die Breit von 200 und die Höhe auf 100 Pixel.

Eine Bemerkung zum Schluss. Viele Methode werden in diesem Programm ohne Punktnotation aufgerufen. Der Grund dafür ist, dass es Methoden der Klasse EinUndAusgabe selbst sind. Man fragt sich, wie das geht, wo sie doch von uns nicht implementiert sind? Die Antwort ist recht einfach, es sind Methoden, die in JFrame implementiert sind und wegen EinUndAusgabe extends JFrame in EinUndAusgabe selbst zur Verfügung stehen als wären sie hier implementiert.
 

Die Ausgabe

Download:
EinUndAus gabe.jaba

In das Eingabefenster lassen sich Zahlen eintragen, das Rechenbutton lässt sich anklicken, aber es passiert nichts. Man erwartet, dass nach dem Klicken auf das Button-Objekt im Ausgabefeld die Fakultät der im Eingabefeld eingegebenen Zahl erscheit. Verwundern darf das allerdings nicht, denn wo sollten wir in unserem bisherigen Quelltext mitgeteilt haben, dass beim Anklicken des Buttons im Ausgabefenster die Fakultät erscheint?
   

zu    

19.2 Aktionsabhorcher und Ereignisse
zur Startseite www.pohlig.de  (C) MPohlig 2003