Dies ist eine historische hinterlassenschaft von vorherigen Versuchen und Versionen von Sun's-JDK. Der erste Ansatz der verfolgt und in dem AWT realisiert wurde bestand in der intensiven Nutzung von nativen Funktionalitäten. Dies hatte zur folge, daß Applikaitonen auf verschiedenen Systemen unterschiedlich aussahen. Weiterhin tauchten etliche Probleme auf, da die verschiedenen graphischen Oberflächen (X-Windows, OpenView, MacOS, Windows) verschiedene Fähigkeiten haben, und deshalb alle Implementationen sehr stark auf die Zeilplatform ausgerichtet werden müssen.
Um dies zu umgehen wurde angefangen die AWT-Klassen auslaufen zu lassen (sie werden zwar noch mitgeführt, aber nicht mehr weiterentwickelt) und eine neue rein Java-Basierte graphische Bibliothek zu bauen.
Diese hat den Nachteil wesentlich Ressourcenhungriger als die AWT zu sein, dafür ist aber sichergestellt, daß die Applikationen auf allen Plattformen dei gleichen Ressourcen zur Verfügung bekommen und gleich aussehen.
public void
actionPerformed(ActionEvent e)
implementiert. Diese Methode ist recht
speziell, sie führt gleich mehrere Konzepte ein:
Hauptsächlich im Graphikbereich werden die Interaktionen zwischen Elementen über 'Events', Ereignissen gesteuert. Sobald der Benutzter z.B. auf einen Knopf drückt wird so ein Ereignis ausgelöst.
Wir serden im Code später sehen, daß das Fenster als AktionListener dem Knopf zugeordnet wird. Dank dieser Methode ist es möglich, daß ein und derselbe AktionListener mehrere andere Bausteine 'überwacht' und dann reagiert wenn diese eine Veränderung mitteilen (z.B. überwachen von einem Knopf, einem Menüpunkt und einer Menutoolleiste).
In diesem Fall ist der Aktionlistener nicht separat definiert, sondern aus einfachheit-halber als das JFrame definiert. In der Regel, werden für jeden AktionsTypen eigene Listener definiert (was den Test ob das korrekte Element das Ereignis ausgelöst hat, unnötig macht.
super("TopDraw");
quit = new JButton("Verlassen");
quit.addActionListener(this);
getContentPane().add("South", quit);
actionPerformed
Hier erzeugen wir ein Objekt der Klasse TopDrawWidow, und befehlen dem sich sichtbar zu machen. Das Resultat sieht folgendermaßen aus:
Dies wird von java dadurch unterstützt, daß für graphische Objekte sogenannnte Layout-Manager zur Verfügung stehen. Diese Layoutmanager haben verschiedene Charakteristika. Der einfachst zu bedienende Layoutmanager, welcher auch als Defaultlayoutmanager benutzt wird ist der BorderLayoutmanager. Wie der Name schon suggeriert, ist dieses Layout Kantenorientiert, damit besitzt ein BorderLayout 5 Felder: Nord, Süd, Ost, West und die Mitte (North,South,East,West,Center).
Was die anderen Layoutmanager angeht, sollte das sehr gut gehaltene tutorial angeschaut werden, falls es weniger um die Theorie geht und mehr um den Gebrauch, gibt es im Tutorial eine Zusammenfassung.
Auch hier hält das Tutorial eine sehr gute Beschreibung.
Das Paradigma, welches gewählt wurde, ist das jedes Element welches Ereignisse auslösen kann, intern eine Liste mit den elementen hält welche sich als Verarbeiter dieser Ereignisse bezüglich dieses einen Elements angemeldet haben.
public void paint(Graphics g)
Die Konsequenz, ist die, daß eine verzögerte Zeichenlogik aufgebaut werden muß. Wir werden irgenwo alle Segmente, die der Benutzer gibt, speichern, damit unere paint Methode diese Segmente finden und darstellen kann. Die Abbildung wird also in zwei Schritten erfolgen:
repaint()
welche dem System
aufträgt zum nächsten möglichen Zeitpunkt dieses Objekt neu zu malen. Sonst
wird paint aufgerufen sobald est notwendig sein sollte (Fenster wurde verdeckt,
des-iconifiziert etc.)
Was das MainTopDraw angeht, braucht mans sich keine Gedanken zu machen: es bleibt gleich.
Diese Klasse wurde als abstract
definiert, d.h. sie kann
nicht instanziiert werden. solche Klassen werden nur benutzt
um für andere Klassen eine gemeinsame Basis zu schaffen.
In unserem Beispiel wird die Klasse Strich
von dieser Klasse
erben, falls zu einem späteren Zeitpunkt Kreise, Elipsen, Schachteln etc
gezeichnet werden sollen, können diese auch von Zeichenbar abgeleitet werden
und generisch als Zeichenbar benutzt werden.
Die Klasse Strich beginnt mit einer komischen Deklaration: static Color farbe = Color.blue. Was bedeutet dies, zur Errinnerung, statisch bedeutet für alle Instanzen dierser Klasse gemeinsam. Weiterhin, der Konstruktor dieser Klasse ist ziemlich einfach, er erlaubt es einfach per Kooridantenangabe das Objekt zu instanziieren.
Das Objekt Graphics wird auf die gewünschte Farbe gesetzt, und das Segment wird gezeichnet.
Objekte vom Typ Strich können sich demnach selber zeichnen, vorausgesetzt man liefert ihnen ein Objekt vom Typ Graphics.
Document mit wml erzeugt von Bruno Böttcher unter Benutzung von öffentlichen Dokumenten.