Grafikprogrammierung in Java:
Grundlagen
10.1 Grundlagen
10.2 Grafische Grundelemente 10.3 Fensterklassen
10.4 Ereignisse und Widgets 10.5 Applets
10.6 Die Swing-Klassen
Schnittstellen für Anwenderprogramme
• Eine Schnittstelle für Anwenderprogramme (application programming interface, API) stellt wohldefinierte und standardisierte Klassen und Methoden zur
Verfügung, die von Anwenderprogrammen genutzt werden können. APIs
ermöglichen es, vorhandene Software um weitere Funktionen zu ergänzen. Einige APIs kennen wir ja bereits.
• Java 7 stellt beispielsweise APIs für die folgenden Zwecke zur Verfügung:
◦ Grafikprogrammierung (mit AWT, Swing)
◦ Datenbankzugriffe (mit JDBC)
◦ Verarbeitung, Auswertung und Transformation von XML-Dokumenten
◦ Verschlüsselung von Daten (Sicherheit, Kryptografie, SecurityManager)
◦ Netzwerkprogrammierung, Parallelprogrammierung, Sound, . . .
• Java 8 erweiterte die API!
Grafikprogrammierung
Java 7 bietet den Programmierern zwei Bibliotheken zur Programmierung von grafischen Benutzeroberflächen (graphical user interface, GUI) an:
• Abstract Window Toolkit (AWT)
Das AWT ermöglicht die Ausführung grundlegender grafischer Operationen. Die Klassen und Methoden des AWTs sind im Standardpaket java.awt enthalten.
• Swing
Seit der Version 1.1 gibt es eine zweite Grafikbibliothek im Java Development Kit.
Sie heißt Swing und ist Bestandteil des Erweiterungspakets javax.swing. Diese Bibliothek beseitigt etliche Schwächen des AWTs und bietet eine weitgehend
plattformunabhängige Schnittstelle. Die Möglichkeiten, die Swing bietet,
übersteigen die des AWTs.
Grafikprogrammierung
Neben AWT und Swing gibt es eine verbreitete Bibliothek zur Programmierung grafischer Benutzeroberflächen:
• Standard Widget Toolkit (SWT)
SWT ist eine Bibliothek für die Erstellung grafischer Oberflächen mit Java. Sie wurde im Jahr 2001 von IBM für die Entwicklungsumgebung Eclipse entwickelt und kommt in einer ganzen Reihe von Anwendungen zum Einsatz, beispielsweise Eclipse selbst. SWT leidet auf einigen Nicht-Windows-Plattformen unter
Effizienzproblemen. SWT gehört nicht zum JDK.
Wir gehen hier (aus Zeitgründen) nicht auf SWT ein. Es gibt weitere Bibliotheken.
Das Abstract Window Toolkit
Die Fähigkeiten des AWTs lassen sich in vier Gruppen einteilen:
• Grundoperationen zum Zeichnen von Linien und Flächen und zur Ausgabe von Text
• Methoden zur Programmsteuerung durch die Behandlung von Maus-, Tastatur- und Fensterereignissen
• Dialogelemente zur Kommunikation mit dem Anwender
• Fortgeschrittene Operationen zur Ausgabe von Bitmaps und Tönen
Ein einführendes Beispiel
import java.awt.*;
public class Fenster extends Frame { Fenster() {
setBackground(Color.yellow);
setSize(200,150);
setLocation(500,500);
setVisible(true);
}
public static void main(String[] args) { new Fenster();
}
}
Das Abstract Window Toolkit
• Zum Ableiten einer eigenen Fensterklasse wird in der Regel entweder die Klasse Frame oder die Klasse Dialog verwendet.
• Um ein neues Fenster zu erhalten, muss ein Objekt der Klasse Frame erzeugt, auf die gewünschte Größe gebracht und durch Aufruf der Methode setVisible
sichtbar gemacht werden.
• Die Ausgabe in ein Fenster erfolgt durch Überlagern der Methode paint. Diese Methode wird immer dann aufgerufen, wenn das Fenster neu gezeichnet werden muss, z. B. beim Programmstart oder beim Verändern der Größe.
• Die Methode void paint(Graphics g) erhält als Parameter einen grafischen
Kontext. Hierunter versteht man allgemeine Einstellungen für Schrift und Grafik,
Ein einführendes Beispiel
import java.awt.*;
class Rechteck extends Canvas { public void paint(Graphics g) {
g.setColor(Color.red);
g.fillRect(20,20,100,40);
g.setColor(Color.black);
g.drawString("Ein rotes Rechteck",20,80);
setLocation(20,15);
} }
// Vokabeltest: canvas = Leinwand
class EinfachesFenster extends Frame { EinfachesFenster() {
add(new Rechteck());
setBackground(Color.yellow);
setSize(200,150);
setVisible(true);
setLocation(200,200);
}
public static void main(String[] args) { new EinfachesFenster();
}
}
Ereignisgesteuerte Programmierung
• Die Programme, die wir bisher betrachtet haben, arbeiten nach dem Prinzip der Ein-Ausgabe-Programmierung.
• Dieses Modell wird jetzt zur ereignisgesteuerten Programmierung erweitert.
Ereignisse sind beispielsweise das Drücken einer Taste, die Betätigung des Rollbalkens oder die Bewegung der Maus.
• Es gibt viele Varianten der ereignisgesteuerten Programmierung. In Java wird das sogenannte Delegation Based Event Handling verwendet. Es bietet die Möglichkeit, GUI-Ereignisse an beliebige Objekte weiterzuleiten und dort zu behandeln. Auf
diese Weise können die Oberfläche und die eigentliche Anwendung klar
voneinander getrennt werden.
Ereignisgesteuerte Programmierung
• Jedes Ereignis besitzt eine Quelle (Source). Ein Ereignis kann von Beobachtern (Listener) wahrgenommen werden. Die Anmeldung von Beobachtern zur
Benachrichtigung vom Eintreten eines Ereignisses ist frei programmierbar und muss immer explizit erfolgen.
• Es ist nicht festgelegt, in welcher Reihenfolge die Beobachter vom Eintreten eines Ereignisses informiert werden. Sichergestellt ist lediglich, dass jeder Beobachter eine Kopie des ursprünglichen Ereignisses erhält.
• Bei der Verbreitung von Ereignissen ist zwischen den Modi single-cast und
multi-cast zu unterscheiden. Für Single-Cast-Ereignisse wird der Beobachter mit einer setxxListener-Methode gesetzt, für Multi-Cast-Ereignisse wird ein
Beobachter mit einer addxxListener-Methode der Menge der Beobachter
Beispiel: Schließen eines Fensters
• Um ein Fenster zu schließen, muss ein WindowListener registriert werden.
• Hierbei handelt es sich um einen Beobachter, dessen Methode windowClosing aufgerufen wird, wenn der Anwender das Fenster über ein System-Menü oder einen Button schließen möchte.
• Das Fenster wird durch setVisible(false) unsichtbar gemacht, seine
Ressourcen durch dispose() wieder freigegeben.
Beispiel: Schließen eines Fensters
import java.awt.*;
import java.awt.event.*;
public class WindowClosingAdapter extends WindowAdapter { public void windowClosing(WindowEvent event) {
event.getWindow().setVisible(false);
event.getWindow().dispose();
System.out.println("Das Fenster wurde geschlossen!");
} }
Frame wnd = new Frame();
wnd.addWindowListener(new WindowClosingAdapter());
wnd.setSize(400,300);
wnd.setVisible(true);
Adapter-Klassen
• Eine Adapter-Klasse ist eine Klasse, die eine gegebene Schnittstelle implementiert, indem sie jede abstrakte Methode durch einen leeren Rumpf realisiert.
• Adapter-Klassen werden verwendet, wenn von einer Schnittstelle lediglich ein Teil der Methoden benötigt wird, der Rest aber uninteressant ist. In diesem Fall leitet man eine neue Klasse aus der Adapter-Klasse ab und überlagert nur die
erforderlichen Methoden.
• Beispiel: Die Klasse WindowAdapter implementiert die Schnittstellen
WindowListener, WindowStateListener, WindowFocusListener und
EventListener durch leere Rümpfe. Hierbei handelt es sich um die folgenden
Methoden:
Die Klasse WindowAdapter
void windowActivated(WindowEvent e) void windowClosed(WindowEvent e) void windowClosing(WindowEvent e)
void windowDeactivated(WindowEvent e) void windowDeiconified(WindowEvent e) void windowGainedFocus(WindowEvent e) void windowIconified(WindowEvent e) void windowLostFocus(WindowEvent e) void windowOpened(WindowEvent e)
void windowStateChanged(WindowEvent e)
Ein einführendes Beispiel
Wir fassen zusammen:
import java.awt.*;
import java.awt.event.*;
class WindowClosingAdapter extends WindowAdapter { public void windowClosing(WindowEvent event) {
event.getWindow().setVisible(false);
event.getWindow().dispose();
System.out.println("Das Fenster wurde geschlossen!");
}
}
class Rechteck extends Canvas { public void paint(Graphics g) {
g.setColor(Color.red);
g.fillRect(20,20,100,40);
g.setColor(Color.black);
g.drawString("Ein rotes Rechteck",20,80);
setLocation(20,15);
}
}
public class EinfachesFenster extends Frame { EinfachesFenster(String title) {
super(title);
addWindowListener(new WindowClosingAdapter());
setBackground(Color.yellow);
setSize(400,200);
add(new Rechteck());
setVisible(true);
}
}
EinfachesFenster e1 = new EinfachesFenster("Erstes Fenster"), e2 = new EinfachesFenster("Zweites Fenster"), e3 = new EinfachesFenster("Drittes Fenster");
e1.setLocation(200,200);
e2.setLocation(400,300);
e3.setLocation(600,400);
Grafikprogrammierung in Java:
Grafische Grundelemente
10.1 Grundlagen
10.2 Grafische Grundelemente 10.3 Fensterklassen
10.4 Ereignisse und Widgets 10.5 Applets
10.6 Die Swing-Klassen
Das grafische Koordinatensystem
• Die Ausgabe von grafischen Objekten basiert auf einem zweidimensionalen Koordinatensystem, dessen Ursprung (0,0) in der linken oberen Ecke liegt.
-
?