From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001
From: Sven Eisenhauer
+Um die Grafikfähigkeiten von Java nutzen zu können, muss
+das Paket java.awt
+eingebunden werden. Dies geschieht zweckmäßigerweise mit
+Hilfe folgender Anweisung am Anfang der Klassendefinition:
+
+
+Danach stehen alle Klassen aus dem Paket java.awt
+zur Verfügung.
+
+
+Zur Ausgabe von grafischen Elementen benötigt die Anwendung ein
+Fenster, auf das die Ausgabeoperationen angewendet werden können.
+Während bei der Programmierung eines Applets ein Standardfenster
+automatisch zur Verfügung gestellt wird, muss eine Applikation
+ihre Fenster selbst erzeugen. Da die Kommunikation mit einem Fenster
+über eine Reihe von Callback-Methoden abgewickelt wird, wird
+eine Fensterklasse in der Regel nicht einfach instanziert. Statt dessen
+ist es meist erforderlich, eine eigene Klasse aus einer der vorhandenen
+abzuleiten und die benötigten Interfaces zu implementieren.
+
+
+Zum Ableiten einer eigenen Fensterklasse wird in der Regel entweder
+die Klasse Frame
+oder die Klasse Dialog
+verwendet, die beide aus Window
+abgeleitet sind. Da Dialog
+vorwiegend dafür verwendet wird, Dialogboxen zu erstellen, die
+über darin enthaltene Komponenten mit dem Anwender kommunizieren,
+wollen wir ihre Verwendung bis zum Kapitel 31
+zurückstellen. Die wichtigste Klasse zur Ausgabe von Grafiken
+in Java-Applikationen ist also Frame.
+
+
+Um ein einfaches Fenster zu erzeugen und auf dem Bildschirm anzuzeigen,
+muss ein neues Element der Klasse Frame
+erzeugt, auf die gewünschte Größe gebracht und durch
+Aufruf der Methode setVisible
+sichtbar gemacht werden:
+
+
+
+
+
+
+ Titel
+ Inhalt
+ Suchen
+ Index
+ DOC
+ Handbuch der Java-Programmierung, 5. Auflage
+
+ <<
+ <
+ >
+ >>
+ API
+ Kapitel 23 - Grafikausgabe
+
+
+
+
+
+23.2 Grundlagen der Grafikausgabe
+
+
+
+
+
+
+
+23.2.1 Anlegen eines Fensters
+
+
+
+
+
+
+
+
+
+
+import java.awt.*;
+
+
+
+
+
+Listing 23.1: Ein einfaches Fenster erzeugen
+
+
+
+
+
+001 /* Listing2301.java */
+002
+003 import java.awt.*;
+004
+005 class Listing2301
+006 {
+007 public static void main(String[] args)
+008 {
+009 Frame wnd = new Frame("Einfaches Fenster");
+010
+011 wnd.setSize(400,300);
+012 wnd.setVisible(true);
+013 }
+014 }
+
+
+Listing2301.java
+
+Das Ausführen dieses Programms führt dazu, dass ein Fenster +mit dem Titel »Einfaches Fenster« erzeugt und in der Größe +400*300 Pixel auf dem Bildschirm angezeigt wird. +
+
![]() |
+
+
+ +Da wir noch keinen Code für die Behandlung von GUI-Events eingebaut +haben, bietet das Fenster lediglich das von Windows her bekannte Standardverhalten. +Es läßt sich verschieben und in der Größe verändern +und besitzt eine Titel- und Menüleiste, die mit einem Systemmenü +ausgestattet ist. Anders als in anderen grafikorientierten Systemen +gibt es noch keine Funktionalität zum Beenden des Fensters. Das +Beispielprogramm kann daher nur durch einen harten Abbruch seitens +des Benutzers (z.B. durch Drücken von [STRG]+[C] +in der DOS-Box, aus der das Fenster gestartet wurde) beendet werden. +Wir werden im nächsten Beispiel Programmcode zum ordnungsgemäßen +Schließen des Fensters einfügen. |
+
+
|
+![]() |
+
+Die Ausgabe in ein Fenster erfolgt durch Überlagern der Methode +paint, +die immer dann aufgerufen wird, wenn das Fenster ganz oder teilweise +neu gezeichnet werden muss. Dies ist beispielsweise dann der Fall, +wenn das Fenster zum ersten Mal angezeigt wird oder durch Benutzeraktionen +ein Teil des Fensters sichtbar wird, der bisher verdeckt war. paint +bekommt beim Aufruf eine Instanz der Klasse Graphics +übergeben: +
+
+
++public void paint(Graphics g) ++ + |
++java.awt.Component | +
+Graphics +ist Javas Implementierung eines Device-Kontexts +(auch Grafikkontext genannt) und stellt +somit die Abstraktion eines universellen Ausgabegeräts für +Grafik und Schrift dar. Die Klasse bietet Methoden zur Erzeugung von +Linien-, Füll- und Textelementen. Darüber hinaus verwaltet +Graphics +die Zeichenfarbe, in der alle Ausgaben erfolgen, und einen Font, der +zur Ausgabe von Schrift verwendet wird. Ein Device-Kontext kann daher +als eine Art universelles Ausgabegerät angesehen werden, das +elementare Funktionen zur Ausgabe von farbigen Grafik- und Schriftzeichen +zur Verfügung stellt. + + + + +
+Die Ausgabe von Grafik basiert auf einem zweidimensionalen Koordinatensystem, +dessen Ursprungspunkt (0,0) in der linken oberen Ecke liegt (siehe +Abbildung 23.1). +Positive x-Werte erstrecken sich nach rechts, positive y-Werte +nach unten. Die Maßeinheit entspricht einem Bildschirmpixel +und ist damit geräteabhängig. + +
+In den meisten Fällen steht dem Programm nicht das gesamte Fenster +zur Ausgabe zur Verfügung, sondern es gibt Randelemente +wie Titelzeilen, Menüs oder Rahmen, die nicht überschrieben +werden können. Mit der Methode getInsets +kann die Größe dieser Randelemente ermittelt werden. Wir +werden darauf in Kapitel 24 +noch einmal zurückkommen. +
+ +
+Abbildung 23.1: Das Koordinatensystem von Java
+ + + + ++Ein einfaches Hauptfenster, wie es im vorigen Beispiel gezeigt wurde, +besitzt keinerlei Funktionalität, um vom Anwender auf geordnete +Weise geschlossen werden zu können. Alle entsprechenden Dialogelemente +im Systemmenü sind ohne Funktion. Tatsächlich mußten +wir das Programm durch Drücken von [STRG]+[C] +abbrechen. Ohne zu tief in Details einzusteigen (diese werden in Kapitel 28 +und Kapitel 29 nachgereicht) +wollen wir an dieser Stelle beispielhaft einen geeigneten Mechanismus +zum Schließen des Hauptfensters vorstellen. + +
+Soll der Anwender ein Hauptfenster schließen können, muss +ein WindowListener +registriert werden. Dabei handelt es sich um ein Interface, dessen +Methode windowClosing +aufgerufen wird, wenn der Anwender über das System-Menü +oder den Schließen-Button das Fenster schließen will. +Das Programm wird in diesem Fall setVisible(false) +aufrufen, um das Fenster zu schließen, und nötigenfalls +System.exit anhängen, um +zusätzlich das Programm zu beenden. + +
+Da ein solcher WindowListener +in praktisch jedem GUI-Programm benötigt wird, wollen wir eine +Klasse WindowClosingAdapter +vorstellen, die in allen folgenden Beispielen wiederverwendet werden +kann: + + +
+
+
+
+001 /* WindowClosingAdapter.java */
+002
+003 import java.awt.*;
+004 import java.awt.event.*;
+005
+006 public class WindowClosingAdapter
+007 extends WindowAdapter
+008 {
+009 private boolean exitSystem;
+010
+011 /**
+012 * Erzeugt einen WindowClosingAdapter zum Schliessen
+013 * des Fensters. Ist exitSystem true, wird das komplette
+014 * Programm beendet.
+015 */
+016 public WindowClosingAdapter(boolean exitSystem)
+017 {
+018 this.exitSystem = exitSystem;
+019 }
+020
+021 /**
+022 * Erzeugt einen WindowClosingAdapter zum Schliessen
+023 * des Fensters. Das Programm wird nicht beendet.
+024 */
+025 public WindowClosingAdapter()
+026 {
+027 this(false);
+028 }
+029
+030 public void windowClosing(WindowEvent event)
+031 {
+032 event.getWindow().setVisible(false);
+033 event.getWindow().dispose();
+034 if (exitSystem) {
+035 System.exit(0);
+036 }
+037 }
+038 }
+
+ |
++WindowClosingAdapter.java | +
+Um den gewünschten Effekt zu erzielen, muss der Listener beim +zu schließenden Fenster durch Aufruf von addWindowListener +registriert werden. Dadurch wird beim Anklicken des Schließen-Buttons +(bzw. beim Aufrufen des entsprechenden Systemmenüeintrags) die +Methode windowClosing +aufgerufen und das Fenster geschlossen. Falls true +an den Konstruktor übergeben wurde, beendet der Listener das +gesamte Programm. + +
+Damit kann Listing 23.1 +wie folgt verbessert werden: + + +
+
+
+
+001 /* Listing2303.java */
+002
+003 import java.awt.*;
+004
+005 class Listing2303
+006 {
+007 public static void main(String[] args)
+008 {
+009 Frame wnd = new Frame("Fenster schließen");
+010 wnd.addWindowListener(new WindowClosingAdapter(true));
+011 wnd.setSize(400,300);
+012 wnd.setVisible(true);
+013 }
+014 }
+
+ |
++Listing2303.java | +
+
![]() |
+
+
+ +Damit sich die Beispiele, in denen der WindowClosingAdapter +verwendet wird, kompilieren lassen, muss die Datei WindowClosingAdapter.java +im aktuellen Verzeichnis vorhanden sein. Sie befindet sich auf der +DVD zum Buch oder kann direkt aus Listing 23.2 +entnommen werden. |
+
+
|
+![]() |
+
| Titel + | Inhalt + | Suchen + | Index + | DOC + | Handbuch der Java-Programmierung, 5. Auflage, Addison +Wesley, Version 5.0.1 + |
| << + | < + | > + | >> + | API + | © 1998, 2007 Guido Krüger & Thomas +Stark, http://www.javabuch.de + |