Grafische Oberflächen mit Swing

Das erste Programm

Das erste Mal

Bei jeder Standardinstallation befinden sich Java-Demos im Installationsverzeichnis von Java unter demo/jfc/SwingSet3. Mit einem Doppelklick lässt sich das Jar-Archiv öffnen und das Programms starten. (Seit Java 8 ist das nicht mehr dabei.)

Ereignisbehandlung

Implementiere ein Swing-Programm, welches

  1. ein JFrame erzeugt,
  2. das Fenster auf die Größe 600 x 200 bringt,
  3. den Titel auf "Man nennt es "Das Fenster"" setzt und das
  4. Fenster auf dem Bildschirm anzeigt.
Lösung mit Swing

Ereignisbehandlung

Einrastern von Fenstern *

Einige Softwareprodukte, wie etwa Winamp, haben für Fenster ein "Einrasten" implementiert. Wenn man etwa 20 Pixel vom Rand entfernt ist, heftet sich das Fenster automatisch an den Rand. Wie wird so etwas prinzipiell funktionieren?

  1. Tipp: Die maximale Auflösung liefert Toolkit.getDefaultToolkit().getScreenSize(). Ein Fenster kann man mit setPosition(...) auf eine absolute Stelle setzen.
  2. Tipp: Es gilt nur noch, die aktuellen Koordinaten während des Verschiebens zu ermitteln. Finde dazu heraus, ob die Methode componentMoved() ein Schlüssel zu dem Problem ist.

Maus-Ereignisse

Erzeuge ein Fenster und fange Maus-Events ab. Gib die Koordinaten auf dem Bildschirm aus.

Lösung 1
Lösung 2

Fenster-Ereignisse

Erzeuge ein Fenster. Die Applikation soll nun auf Eigenschaften wie Miniaturisieren oder Schließen der Fenster reagieren. Dazu soll die Schnittstelle java.awt.event.WindowListener implementiert werden. Die Applikation soll beim Versuch des Schließens beendet werden (System.exit(0)). Nimm den Quellcode für einen MouseMotionListener als Vorlage.

Lösung

JClosableFrame

Implementiere die Hilfsklasse JClosableFrame, die automatisch das Fenster schließt, falls der Benutzer das X im Fensterrahmen (oder Alt+F4) drückt. JClosableFrame soll eine Unterklasse von javax.swing.JFrame sein. Achte auf die Behandlung der Ereignisse mit setDefaultCloseOperation(...). Man kann dann diese Klasse für ihre eigenen Programme nutzen und muss sich dann nicht mehr um die Schließen-Ereignisse kümmern. Zwar würde das Fenster mit setDefaultCloseOperation(...) auch geschlossen, aber wir könnten auf das Ende nicht mehr mit einer eigenen Aktion reagieren.

  1. Gib, falls das Fenster geschlossen wird, eine Meldung auf dem Bildschirm aus.
  2. Nutze die Klasse javax.swing.JOptionPane und die Methode showConfirmDialog(...), um einen Bestätigungsdialog anzuzeigen. Die API-Dokumentation zeigt ein Beispiel für diese Methode. Man kann als String eine Nachricht einsetzen, wie etwa "Soll die Applikation wirklich beendet werden?"
Lösung JClosingFrame
Ein Testprogramm

Ein JFrame

  1. Schreibe ein Programm, welches ein javax.swing.JFrame mit einem javax.swing.JLabel auf dem Bildschirm ausgibt. Setze die Größe des Fenster auf 256 x 256 Pixel.
  2. Füge dem javax.swing.JLabel Fenster einen java.awt.event.MouseMotionListener hinzu. Wird die Maus bewegt, sollen die Koodinaten auf den Bildschirm gebracht werden.
  3. Erfrage aus dem java.awt.event.MouseEvent den Verursacher des Ereignisses. (Das wird dann ja das javax.swing.JLabel gewesen sein.) Nutze die x- und y-Koordinaten, um daraus ein Farb-Objekt zu bauen: new java.awt.Color(x,y,0). Setze dann diese Farbe mit Hilfe der Methode setColor(...).

Lösung für ein JFrame mit JLabel

Komponenten

Schaltflächen mit JButton

Ein javax.swing.JFrame soll über einen javax.swing.JButton auf dem Bildschirm verfügen. Wird der Button drückt, soll die Applikation geschlossen werden.

Layoutmanager

Wie kann eine Telefontastatur mit Hilfe eines java.awt.GridLayout gezeichnet werden?

  1. Nutze einen Konstruktor, mit dem man etwas Abstand zwischen die Tasten bekommt.
  2. Setze mit geschachtelten Layouts über die Tastatur ein javax.swing.JTextField und unter die Tastatur ein javax.swing.JTextArea-Objekt. Wie muss man die Layoutmanager verschachteln? Denke an javax.swing.JPanel, um einen Container für Komponenten zu bilden.
  3. Werden Schaltflächen gedrückt, sollen im oberen Textfeld die gedrückten Ziffern gesammelt werden. Nutze dafür intern einen String, der bei jeder gedrückten Taste wächst.
  4. Erweiterung: Werden in der Textzeile bis zu acht Ziffern eingesetzt, so sollen im Textfeld zu einer Telefonnummer mögliche Merkhilfen genannt werden.
    Die Merkhilfe basiert auf der Idee, dass auf einer Telefontaste zusätzliche Buchstaben stehen, sodass aus einer Telefonnummer eine Zeichenkette als Gedächtnisstütze wird. Folgende Zuweisung wird vorgenommen: 1:1, 2:ABC, 3:DEF, 4:GHI, 5:JKL, 6:MNO, 7:PQRS, 8:TUV, 9:WXYZ.
    Ein ähnliches Windows-Programm findet man unter http://www.maf-soft.de.

Euro-Umrechner

Schreibe eine Swing-Applikation zum Umrechnen der DM-Beträge in Euro-Beträge. Baue dazu eine grafische Oberfläche mit zwei Textfeldern (javax.swing.JTextField) auf. Wenn man in der oberen Textbox (für Euro) etwas schreibt, dann sollte in der unteren Textbox der Wert angezeigt werden. Die Umrechnung sollte umgekehrt genauso funktionieren. Implementiere für die Ereignisbehandlung einen ActionListener.
Nutze ein java.awt.BorderLayout, um die Textfelder anzuordnen. (Man kann auch mit einem GridLayout-Manager rechts den Text (Euro/DM) und links die Textfelder platzieren).

Scrollbars und Textfelder

  1. Ein Fenster soll einen horizontalen Schieberegler javax.swing.JScrollBar enthalten. Implementiere eine Ereignisbehandlung und gib den selektierten Wert auf dem Bildschirm aus.
  2. Der Schieberegler soll die Werte 0 bis 255 annehmen können.
  3. Erweiterung: Das Fenster soll zusätzlich ein java.awt.Canvas-Objekt enthalten.
  4. Gib dem Hintergrund die Standard-Farbe Schwarz. Das kann man mit der Methode setBackground( new Color(0,0,0) ) erreichen.
  5. Wenn man den Schieberegler bewegt, soll sich die Farbe im Textfeld ändern. Es soll nur der Blau-Wert verändert werden.
JScrollBar gibt Werte auf dem Bildschirm aus
AWT-Lösung für den Scrollbar und die Farbveränderung

Ein UPN-Taschenrechner

Viele einfache Programmiersprachen erlauben arithmetische Ausdrücke in umgekehrt Polnischer Notation (UPN). Ein bekanntes Beispiel dafür ist Postscript. Programmiere einen Taschenrechner, der mittels des java.util.StringTokenizer einen String (wie etwa 12 34 23 + *) parst und das Ergebnis auswertet.

Euro-Umrechner

Schreibe ein Programm zur Euro-Umrechnung. Dabei soll eine javax.swing.JList zu sehen sein. Wird in ein Eingabefeld ein Betrag eingesetzt, soll der Betrag in einem anderen Feld in der angewählten Währung ausgegeben werden. Bei der European Central Bank gibt es die aktuellen Kurse.