Informatik > Lexikon

Java-Anwendungen

Eine etwas komplexere Java-Anwendung

Hier wurde die minimale Java-Anwendung aus Folge 5.1 um zwei Textfelder und einen Button erweitert. In das obere Textfeld wird ein Text geschrieben, das untere Textfeld bleibt zunächst leer. Wenn man auf den "Kopieren"-Button klickt, wird der Text aus dem oberen Textfeld ausgelesen und in das untere Textfeld kopiert. Anfangen kann man mit dieser Java-Anwendung absolut nichts, es handelt sich einfach um ein leeres Grundgerüst, das Sie jetzt für Ihre speziellen Anwendungen aufrüsten können.

Hier zunächst der komplette Quelltext dieser etwas komplexeren Java-Anwendung. Sie können sich den Quelltext in die Zwischenablage kopieren und dann selbst ausprobieren.

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

public class Anwendung2 extends JFrame implements ActionListener
{
    TextField    eingabe, ausgabe;
    Button       ok;
    
    public Anwendung2()
    {
        setSize(500,500);
        setTitle("Eine simple Java-Anwendung");
        setResizable(false);
        setVisible(true);
        initComponents();
        init();
    }
   
    public void initComponents()
    {
        eingabe = new TextField();
        ausgabe = new TextField();
        ok      = new Button("Kopieren");
        
        setLayout(null);
        
        eingabe.setBounds(20, 70,300,40);
        ausgabe.setBounds(20,120,300,40);
        ok.setBounds(20,170,300,40);
        
        eingabe.setBackground(new Color(255,255,220));
        ausgabe.setBackground(new Color(220,255,255));
        
        eingabe.setFont(new Font("Arial",1,18));
        ausgabe.setFont(new Font("Arial",1,18));
        ok.setFont(new Font("Arial",1,18));        
        
        ok.addActionListener(this);
        
        add(eingabe);
        add(ausgabe);
        add(ok);
    }
    
    public void init()
    {
    }
    
    public void actionPerformed(ActionEvent event)
    {
       if (event.getSource() == ok)
       {
          ausgabe.setText(eingabe.getText()); 
       }
    }
    
    public static void main(String[] args) 
    {
        new Anwendung2();
    }
}

Interessant ist bei dieser einfachen Anwendung, dass auch gezeigt wird, wie man die Farben der Textboxen sowie die Schriftarten und Schriftgrößen anpassen kann.

Bei den Windows-Rechnern in meiner Schule passiert häufig folgender Fehler: Der Button wird zweimal angezeigt und funktioniert nicht mehr richtig. Auf meinem Mac Pro unter Sierra läuft die Anwendung dagegen fehlerfrei, auf den Schulrechnern manchmal auch. Interessant. Ich habe bisher noch nicht herausgefunden, was die Ursache für diesen Fehler ist. Ich vermute, die Graphikkarten in unseren Schulrechnern. Wenn man dort eine Java-Anwendung oder ein Java-Applet startet, wird manchmal (natürlich nicht reproduzierbar) ein Teil des Bildschirminhalts in das leere Fenster der Anwendung oder des Applets hineinkopiert. Auf dem Lehrerrechner passiert das meistens nicht, weil der eine richtige Graphikkarte besitzt.

Quelltext-Analyse

Analysieren wir diesen Quelltext nun Zeile für Zeile.

minimale Java-Anwendung

Wenn Sie überhaupt keine Ahnung von Java-Anwendungen haben, gehen Sie bitte zunächst auf die Folge 5.1, wo eine minimale Java-Anwendung ausführlich erläutert wird. Diese Grundkenntnisse werden hier nämlich vorausgesetzt.

Ereignisbehandlung

Unter diesem Stichwort versteht man die Tatsache, dass eine Java-Anwendung auf Aktionen des Benutzers reagiert. Dazu gehören vor allem Mausklicks auf Buttons, Mausbewegungen, Texteingaben über die Tastatur und so weiter. Die Methode, die solche Ereignisse abfängt und behandelt, heißt actionPerformed(). Damit diese Methode benutzt werden kann, sind die beiden folgenden Zeilen notwendig:

import java.awt.event.*;

public class Anwendung2 extends JFrame implements ActionListener

Vielen Leuten - teils auch mir selbst - ist der Unterschied zwischen "extends" und "implements" nicht so ganz klar. Die extends-Anweisung steht für "richtige" Vererbung. Die vorhandene Klasse, die man gerade implementiert, erweitert ("extends") die eingebundene Mutterklasse, hier also JFrame. In einigen Programmiersprachen gibt es die sogenannte Mehrfachvererbung, das heißt, eine Klasse kann Attribute und Methoden von mehreren Mutterklassen erben. Allerdings sorgt das manchmal für Verwirrung, wenn beispielsweise beide Mutterklassen das gleiche Attribut oder die gleiche Methode besitzen. In Java hat man die Mehrfachvererbung über die sogenannten Interfaces gelöst. Das sind quasi Sammlungen von leeren Methoden mit Parameterlisten, die über "implements" in die Klasse eingebunden werden und die dann in der Klasse selbst mit Inhalt gefüllt werden müssen. Das Interface schreibt der Klasse also vor, welche Methoden sie genau zu implementieren hat - einschließlich der Parameter der Methoden.

Allerdings ist es nicht so, dass das Interface ActionListener die Methode actionPerfordmed() zur Verfügung stellt. Nein, das Interface schreibt dem User nur vor, dass er bitte schön die Methode actionPerfordmed() mit dem Parameter der Klasse ActionEvent in seine Klasse integriert. Macht er das nicht, liefert der Compiler eine Fehlermeldung.

Buttons

Den Button müssen wir mit Hilfe der Klasse Button in die Anwendung einbinden. In unserem Beispiel heißt das Button-Objekt einfach ok.

Im Konstruktor oder in unserem Beispiel in einer eigenen Methode wird das Button-Objekt nun initialisiert:

 ok      = new Button("Kopieren");

Damit wird der Button erzeugt und erhält auch gleich seine Beschriftung "Kopieren". Vielleicht hätte man den Button hier besser als kopieren bezeichnet und nicht als ok.

Wenn man es dabei belässt, also nichts weiter mit dem Button macht, wird er irgendwo in der Anwendung platziert, wahrscheinlich oben links - ich habe es noch nicht ausprobiert. Will man den Button pixelgenau positionieren, muss man die setBounds()-Methode der Klasse Button aufrufen:

 ok.setBounds(20,170,300,40);

Die linke obere Ecke des Buttons befindet sich nun an der Position (20,170), und der Button hat eine Länge von 300 Pixeln und ist 40 Pixel hoch.

Der User kann den Button zwar sehen und anklicken, aber nach einem Klick passiert noch nichts, obwohl die Methode actionPerformed ja schon vorhanden ist. Aber man muss den Button selbst auch noch dazu befähigen, auf Aktionen zu reagieren. Das geschieht mit dieser Anweisung:

 ok.addActionListener(this);

Mit dem Parameter this ist die eigene Klasse gemeint, also die Klasse Anwendung1, an der wir gerade arbeiten. Erst nach dem Aufruf dieser Methode addActionListener() ist das Button-Objekt mit dem ActionListener verbunden, kann also auf Benutzer-Aktionen reagieren.

Die Anweisung

 ok.setFont(new Font("Arial",1,18)); 

ist nur eine kosmetische Operation. Die Beschriftung des Buttons soll in der Schriftart Arial mit einer Größe von 18pt erfolgen und weder fett noch kursiv dargestellt sein (Parameter 1).

Bisher ist alles gut und schön, aber trotzdem funktioniert die Anwendung noch nicht. Denn wir haben der Anwendung noch nicht formal korrekt mitgeteilt, dass sie überhaupt einen solchen Button besitzt. Jede richtige Java-Anwendung hat ja eine Vielzahl an Komponenten, also Buttons, Editboxen, Listboxen, Menüs und so weiter. Damit die Anwendung hier den Überblick behält, verwaltet sie eine Liste solcher Komponenten. Mit dem add()-Befehl wird eine solche Komponente nun in diese Liste aufgenommen:

add(ok);

Jetzt ist alles fertig, was den Button betrifft. Er wird angezeigt und kann auf Benutzereingaben reagieren.

TextField

Unsere Anwendung besitzt zwei kleine Textfelder, in denen Text nicht nur angezeigt, sondern auch eingetippt werden kann. Dazu dient die Klasse TextField. Die beiden Textfelder werden ähnlich implementiert wie der Button, daher können wir uns hier jetzt kurz fassen.

Nach der Deklaration werden die TextField-Objekte initialisiert und positioniert, auch mit dem setBounds()-Befehl. Mit dem setBackground()-Befehl wird die Hintergrundfarbe der beiden Textfelder festgelegt - es muss ja nicht immer die Standard-Farbe sein. Beide Textfelder müssen mit dem add()-Befehl der Komponentenliste der Anwendung zugefügt werden. Das war's eigentlich schon, was man über die Textfelder sagen kann.

ActionPerformed

Diese extrem wichtige Methode ist quasi das Zentrum der Anwendung. Sie läuft ständig im Hintergrund und wartet auf Benutzer-Aktionen.

    public void actionPerformed(ActionEvent event)
    {
       if (event.getSource() == ok)
       {
          ausgabe.setText(eingabe.getText()); 
       }
    }

Der Parameter event steht für die möglichen Ereignisse (engl. event = Ereignis). Mit der Methode getSource() der Klasse ActionEvent findet die Methode heraus, welche Komponente vom Benutzer aktiviert wurde. Dazu dient die Anweisung

if (event.getSource() == ok)

Hat man zwei oder mehrere Buttons in der Anwendung implementiert, kann man mit einer geschachtelten if-Anweisung herausfinden, welcher dieser Buttons aktiviert wurde.

Was soll passieren, wenn der Button geklickt wurde? Auch das wird von der actionPerformed()-Methode geregelt. Aus dem Textfeld eingabe soll der Text ausgelesen werden, das geschieht mit der Methode getText() der Klasse TextField. Der ausgelesene Text wird mit der Methode setText() jetzt direkt in das andere Textfeld geschrieben.

Unterstützung dieser Homepage

Wenn Sie als Kollegin oder Kollege diese Homepage unterstützen wollen, in die ich viel Geld und Zeit investiere, würde ich mich über eine kleine Spende freuen.

Vielen Dank!