230 likes | 470 Views
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 8 Zeichnen in Java. Sommersemester 2003 Lars Bernard. Die Klasse Component. Die zentrale Klasse für alle AWT-Elemente Alle GUI-Klassen erben von Component
E N D
Praktikum Entwicklung und Einsatz von Geosoftware I-Sitzung 8Zeichnen in Java Sommersemester 2003 Lars Bernard
Die Klasse Component • Die zentrale Klasse für alle AWT-Elemente • Alle GUI-Klassen erben von Component • Für Swing wird die Klasse JComponent benutzt (die aber auch von Component erbt) Geosoftware I – Lars Bernard
Die Klasse Component • Component ist eine abstrakte Klasse (die paint-Methode ist nicht implementiert) • Alle GUI-Elemente überschreiben die paint-Methode und malen sich selbst: • Ein Button zeichnet in paint einen Button • Ein TextField zeichnet in paint den Text • ... Geosoftware I – Lars Bernard
Zeichnen von AWT - Komponenten AWT-Komponenten zeichnen sich mit Hilfe der paint() Methode selbst. Sequentieller Aufruf von: • repaint() • update() • paint() Geosoftware I – Lars Bernard
Zeichnen von AWT - Komponenten Component.repaint() Aufruf wenn • das Fenster (Container) verschoben wird • die Größe des Containers verändert wird • ein verdeckter Teil des Container-Inhaltes wieder frei gegeben (sichtbar) wird • […] Geosoftware I – Lars Bernard
Zeichnen von AWT - Komponenten Component.repaint() Component.getGraphics() Liefert spezialisierte Instanz der abstrakten Graphics-Klasse: • Grafik-Kontext, in den gezeichnet werden kann • repräsentiert ein universelles Ausgabegerät für Grafik und Schrift, • Kapselt alle Zeichenoperationen: • stellt Methoden zur Erzeugung von Linien, Füll- und Schriftelementen zur Verfügung, • verwaltet die Zeichenfarbe und den Font in dem Textausgaben erfolgen sollen. Geosoftware I – Lars Bernard
Zeichnen von AWT - Komponenten Component.repaint() Component.getGraphics() Component.update(Graphics g) • Standardmäßig: Löschen des Hintergrundes (mit background color) • Zeichnen des Komponenten-Inneren durch Aufruf der paint()-Methode Geosoftware I – Lars Bernard
Zeichnen von AWT - Komponenten Component.repaint() Component.getGraphics() Component.update(Graphics g) Component.paint(Graphics g) • Zeichnet „in“ das Graphics-Objekt • Wird zur Darstellung „eigener“ Komponenten überschrieben Geosoftware I – Lars Bernard
Die Klasse Graphics • Graphics kapselt alle Zeichen-Operationen • Die Klasse ist abstrakt • Zeichnet direkt in den Bildschirmspeicher Geosoftware I – Lars Bernard
Die Klasse Graphics - Methoden • abstract Rectangle getClipBounds() Liefert den äußeren Rand des zu zeichnenden Bereichs • abstract void setColor(Color c) Setzt die aktuelle Farbe • abstract void setFont(Font f) Setzt die aktuelle Schriftart • abstract void drawString(String s, int x, int y) Zeichnet den String s an der Position (x,y) • abstract void drawArc(...) Zeichnet einen Kreis • abstract void drawRect(...) Zeichnet eine Rechteck • abstract void drawLine(...) Zeichnet eine Linie Geosoftware I – Lars Bernard
Graphics - example class GISViewer extends JPanel { Dimension preferredSize = new Dimension(400,150); public Dimension getPreferredSize() { return preferredSize; } public void paintComponent(Graphics g) { super.paintComponent(g); //paint background g.fillRect(50, 50, 20, 20); } } Geosoftware I – Lars Bernard
Graphics - example GISFrame(String s) { ... // add components: contentPane.add(new GISViewer()); .... } Geosoftware I – Lars Bernard
Zeichnen von AWT - Komponenten • Ausgabe von Grafik basiert auf einem zweidimensionalen Koordinatensystem • Ursprungspunkt (0,0) liegt in der linken oberen Ecke • Die Maßeinheit entspricht einem Bildschirmpixel und ist damit geräteabhängig Geosoftware I – Lars Bernard
Koordinatentransformation • Jedes Grafik-Objekt “lebt” in einem Bildschirm-Koordinatensystem (u,v) • Geoobjekte “leben” in einem Welt-Koordinatensystem (x,y) • Somit ist zur Darstellung von Geoobjekten zumeist eine Koordinaten-Transformation (x,y) (u,v) notwendig Geosoftware I – Lars Bernard
u y v x u v Koordinatentransformation • Probleme: • unterschiedliche Orientierung • unterschiedliche Skalender beiden Koordinatensysteme Geosoftware I – Lars Bernard
Arten von Transformationen Geosoftware I – Lars Bernard
Arten von Transformationen • Translationen T (Verschiebung) • Rotationen R (Drehung) • Skalierungen M (Maßstabsänderung) • Scherung S • Affintransformationen = T + R + M + S Geosoftware I – Lars Bernard
Affine Transformationen • verbreitete Transformation zwischen allen Punkten einer Ebene • erfordert 6 Parameter (in 2D) Geosoftware I – Lars Bernard
Affine Transformationen • m00, m11 : Streckungs-/Stauchungsfaktoren • m01, m10 : Scherfaktoren • m02, m12 : Translation (Verschiebung) Geosoftware I – Lars Bernard
Transformationen in JavaGraphics2D • Seit Java 1.2 verfügbar • unterstützt affine Transformationen • Rotationen • Streckungen • Verschiebungen • erbt von Graphics • In Java 1.2 können Graphics-Objekte in Graphics2D umgewandelt werden: Graphics2D g2D=(Graphics2D) g; Geosoftware I – Lars Bernard
Transformationen in Java • class AffineTransform • 6 Parameter, einzeln setzbar: • set-/getScaleX, -ScaleY => m00, m11 • set-/getShearX, -ShearY => m01, m10 • set-/getTranslateX, -TranslateY => m02, m12 Geosoftware I – Lars Bernard
Beispiel Transformationen import java.awt.geom.*; ... void updateTransformation(){ //initialize transformation af.setToIdentity(); // RealWorld x and y extent, asssuming there is maxX etc. double dx = maxX - minX; double dy = maxY - minY; // isotropic scaling: double scaleX = getWidth()/ dx; double scaleY = getHeight()/ dy; if (scaleX < scaleY) af.scale(scaleX,-scaleX); else af.scale(scaleY,-scaleY); // ...and translation af.translate(-minX(),-maxY()); } Geosoftware I – Lars Bernard
Zu Aufgabe 6 • Zunächst Realisierung der in diesen Folien enthaltenen Beispiele • Machen Sie sich klar wie der Algorithmus für eine Transformation von Geokoordinaten in Bildschirmkoordinaten aussieht ! • Zum Nachlesen Overview of the Java 2D API im Tutorial • Abgabe am 7.07.2003 Geosoftware I – Lars Bernard