Java und Swing

Willemers Informatik-Ecke

Auch Java-Anwendungen können mit einer grafikschen Oberfläche versehen werden. Die haben dann Fenster, Menüs und Buttons wie andere Programme auch.

Im Gegensatz zu anderen Programmiersprachen haben Java-Programme, dass es für jede Plattform angepasst werden muss. Du hast da einmal Windows, Mac und Linux. Allein bei Windows gab es dann die Programmierschnittstellen Win32, OWL, MFC, ATL und .NET, von denen inzwischen wieder einige veraltet sind.

Javas grafische Oberfläche läuft allerdings auch schon im zweiten Versuch. Der erste Anlauf war AWT, das dann kurze Zeit später durch Swing ersetzt wurde, weil dieses mehr Möglichkeiten bot. Dennoch kann man auch heute noch AWT-Programme schreiben. Und einige der AWT-Klassen wie beispielsweise das Layout werden auch für Swing einfach mitbenutzt.

Die Portabilität von Java-Programmen macht Java in professionellen Umgebungen, in denen unterschiedliche Plattformen verwendet werden, sehr attraktiv.

JFrame

Das Swing-Programm benötigt zunächst einen Rahmen, in dem alles passiert. In einer Anwedung ist das ein Fenster, das von der Klasse JFrame geliefert wird. Dieser Rahmen liefert nicht nur das Drumherum, sondern auch einen Container, in dem später all das organisiert wird, was den sichtbaren Teil des Programms ausmacht.

Unser erstes Programm wird ein einfaches Fenster erzeugen, das wir auf dem Bildschirm anzeigen. Wir verwenden Swing. Um die Klassen von Swing direkt verwenden zu können, importieren wir sie.

Wir erzeugen dann ein Objekt der Klassse Jframe. Da im Fenster nichts enthalten ist, wird es die kleinstmögliche Größe annehmen und kaum auf dem Bildschirm zu finden sein. Aus diesem Grund geben wir eine Mindestgröße vor. Zuletzt wird der JFrame sichtbar geschaltet, sonst haben wir ja nichts davon.

import javax.swing.*;

public class ErsterSwing {
    public static void main(String[] args) {
        JFrame Fenster = new JFrame("Schrödinger-Fenster"); 
        Fenster.setSize(400, 300);
        Fenster.setVisible(true);
    }
}
Zunächst stellen wir das Programm um. Statt aus dem Hauptprogramm das Fenster zu erstellen, wird das neue Swing-Programm von JFrame abgeleitet. Das hat Vorteile, wenn wir später die Ereignisse fangen wollen. Dazu sollte das Hauptprogramm nämlich selbst ein abgeleitetes JFrame sein und so die Ereignisse leichter fangen können. Ein paar Handgriffe und wir sind fertig:
import javax.swing.*;

public class ErsterSwing extends JFrame {

    ErsterSwing() {
        this.setSize(400, 300);
        this.setVisible(true);
    }
    public static void main(String[] args) {
        new ErsterSwing();
    }
}
Nun ist das Hauptprogramm eine Erweiterung der Klasse JFrame. JFrame übernimmt bereits die meisten Aufgaben. Nur wenn etwas passiert, was die Anwendung selbst betrifft, wird eine der bestehenden Methoden überschrieben.

Ereignisse

Eine grafische Applikation wird durch die Ereignisse gesteuert, die eintreten, wenn der Anwender mit dem Programm interagiert. Einige der Ereignisse werden bereits von den Java-Swing-Klassen zufriedenstellend behandelt. In einigen Fällen will aber das Programm die Kontrolle.

Fensterereignisse

Das Schließen des Fensters führt in der Regel zum Ende der Applikation. Dieses Standardverhalten wird mit einer einzigen Zeile erreicht.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Möchte das Programm vor dem Ende die Daten sichern oder andere Reinigungsarbeiten übernehmen, muss es das Ende-Ereignis fangen. Dazu fügt es einen neuen WindowAdapter als WindowListener hinzu, der die Methode windowClosing überschreibt. Hier der Quellcode:
addWindowListener(
    new WindowAdapter() {
        public void windowClosing(WindowEvent ev) {
            dispose();
            System.exit( 0 );
        }
    }
);
Das Programm überschreibt es die Methode windowClosing der Klasse WindowAdapter, die das Ereignis standardmäßig fängt. Dieser neue WindowAdapter wird als Paramter der JFrame-Methode addWindowListener übergeben, die diesen WindowsAdapter für die Bearbeitung anmeldet.

Innerhalb der Methode windowsClosing kann nun die Anwendung alles tun, was erforderlich ist, damit das Programm aufgeräumt verlassen werden kann.

Mausereignisse

Um Mausereignisse zu fangen, implementiert die Anwendung das Interface MouseListener für einmalige Ereignisse wie das Klicken oder MouseMotionListener für die Bewegung der Maus. Das Interface MouseInputListener vereinigt beides in sich.

MouseListener

  • void mouseClicked(MouseEvent e)
    Die Methode mouseClicked wird aufgerufen, wenn ein vollständiger Klick ausgeführt wurde. Ein Klick besteht aus dem Herunterdrücken und dem Loslassen der Maustaste. Diese beiden Ereignisse lassen sich auch separat bearbeiten.
  • void mousePressed(MouseEvent e)
    Die Methode mousePressed wird aufgerufen, wenn die Maustaste gedrückt wird und mouseReleased, wenn sie wieder losgelassen wird.
  • void mousePressed(MouseEvent e)
    Tatsächlich wird in der Praxis meist mouseReleased verwendet, wenn ein Mausklick behandelt werden soll.

MouseMotionListener

  • void mouseMoved(MouseEvent ev)
    Diese Methode muss auf jeden Fall implementiert werden. Sie wird bei Mausbewegungen aufgerufen.
  • void mouseDragged(MouseEvent ev)
    Diese Methode wird aufgerufen, wenn die Maus bei gedrückter Taste bewegt wird.
Über das als Paramter übergebene Objekt der Klasse MouseEvent können die Methoden getX und getY aufgerufen werden, um die momentane Mausposition zu ermitteln.

Tastaturereignisse

ie Tastatur wird deutlich seltener direkt abgefragt als die Maus. Texteingaben werden durch die Eingabefelder geregelt und Tastaturkürzel für die Ausführung von Programmfunktionen werden durch die Menü-Shortcuts übernommen. Prinzipiell ist die Vorgehensweise ähnlich wie bei den Mausereignissen. Zunächst implementiert die Anwendung den KeyListener. Im Konstruktor meldet sich die Klasse durch Aufruf von addKeyListener an. Nun implementiert die Klasse die Methoden keyTyped, keyPressed und keyReleased und wird so darüber informiert, wenn der Anwender eine Taste drückt. Aus dem übergebenen Objekt der Klasse KeyEvent wird mithilfe der Methode getKeyCode oder der Methode getKeyChar ermittelt, welche Taste gedrückt wurde.
void keyTyped(KeyEvent ke)
void keyPressed(KeyEvent ke)
void keyReleased(KeyEvent ke)
Methode Zweck
addWindowListener(WindowAdapter wc) bindet die Ereignisbehandlungsklasse wc an den JFrame
setLocation(int a, int b) setzt Breite auf a, Höhe auf b
setTitle(String s) setzt s in den Verschiebebalken
setVisible(boolean b) macht den JFrame sichtbar oder unsichtbar


Homepage - Java (C) Copyright 2004,2011 Arnold Willemer