Viewer
Den Abschluss des Kapitels zur Computergraphik bilden Viewer. Sie werden in den weiteren Kapiteln zur Visualisierung von Geodaten eingesetzt und sind im Paket de.hsbo.fbv.bmg.graphics.viewer zu finden.
Die Klassenbilbiothek für den einfachen Viewer wird auch als Java-Archiv bereitgestellt.
Einfacher Viewer
Ein einfacher Viewer wird im Paket de.hsbo.fbv.bmg.graphics.viewer.simple bereitgestellt. Es besteht aus folgenden Java-Dateien:
- Die zentrale Klasse Map ist von der Swing-Klasse JPanel abgleitet und kann daher als Darstellungselement in Java Frames eingebunden werden. In die Map-Objekte werden verschiedene Darstellungsebenen vom Typ Layer eingebunden und angezeigt. Interaktionen sind in der vorliegenden Version nicht vorgesehen.
- Das Interface Layer bildet den Datentyp, der intern zur Verwaltung der Darstellungsebenen in Map dient. Es ist vorgesehen, dass die enthaltenen geometrischen Figuren vom datentyp StyledShapes sind.
- Die Klasse StyledShape entält geometrische Figuren vom Typ Shape und verwaltet zusätzliche Darstellungseigenschaften wie z.B. Farben, Linienstile und Füllmodi.
- Die Adpaterklasse ShapeLayer implementiert das Interface Layer und verwaltet Objekt vom Typ Shape. Die graphische Gestaltung wird einheitlich auf alle gespeicherten Objekte eines ShapeLayers übertragen.
- Die weiteren Klassen enthalten Quelltext-Beispiele, die die Einbettung in einfache JFrame-Objekte demonstrieren.
Im Paket de.hsbo.fbv.bmg.graphics.viewer.demos sind zwei Anwendungsbeispiele des einfachen Viewers enthalten. Zusätzlich befindet sich darin eine Testklasse, die die Verwendung der Double-Buffering-Technologie für einen einfachen Frame demonstriert.
Experimenteller Viewer
Das Paket de.hsbo.fbv.bmg.graphics.viewer.commands enthält einen experimentellen Viewer, dessen Verhalten konfigurierbar ist. Seine Architektur folgt dem Entwurfsmuster (design pattern) COMMAND (siehe Gamma, et.al.). Dazu stehen drei verschiedene Demos mit unterschiedlich angepassten COMMAND-Klassen zur Verfügung:
- Demo0 stellt eine einfache Graphik ohne jeglich Interaktionsmöglichkeiten dar.
- Demo1 stellt die gleiche Graphik wie Demo0 dar, die sich allerdings automatisch an die Größe des Frames anpasst.
- Demo2 bietet weitere Interaktionen:
- MouseEntered stellt den Cursor auf CROSSHAIR (Fadenkreuz) um.
- MouseExited setzt den Cursor auf den Standard zurück und gibt in der Titelleiste "Cursor lost!" an.
- MouseMoved gibt in der Titelleiste die Mauskoordinaten im WCS an.
- MouseDragged verschiebt die Graphik im Fenster.
Funktionsweise:
Das Map-Objekt (Klasse MapAdapter) liest zu Beginn ein Command-Objekt ein, das das Verhalten der Map initialisiert. Darin wird die Funktionalität zum Darstellen des Inhalts (Methode paint()) sowie für verschiedene Maus- und Tastatur-Ereignisse festgelegt.
Code-Beispiel für Demo0:
@Override
public void execute() {
this.map.setWorldBounds(new Rectangle2D.Double(0,0,400,300));
// CmdPaint = 0;
this.map.setCommand(Map.CmdPaint, new Demo0MapCmdPaint(this.map));
// CmdMouseReleased = 1;
// CmdMousePressed = 2;
// CmdMouseExited = 3;
// CmdMouseEntered = 4;
// CmdMouseClicked = 5;
// CmdMouseMoved = 6;
// CmdMouseDragged = 7;
// CmdMouseWheelMoved = 8;
// CmdKeyTyped = 9;
// CmdKeyReleased = 10;
// CmdKeyPressed = 11;
}
Für jede der o.a. Positionen kann ein Command-Objekt zugewiesen werden. Soll das Verhalten der Map temporär verändert werden, kann das zuständige Kommando mit this.map.setCommand() ersetzt werden.
Alle Command-Objekte implementieren das Interface Command, das die Methode execute() enthält, um ein Kommando auszuführen. Die Adapterklassen, die zur Steuerung der Map vorgesehen sind, enthalten ihrerseits das Map-Objekt, mit dem sie über Getters und Setters auf die Map-Attribute zugreifen können.