Praktikum Entwicklung und Einsatz von Geosoftware I • Sitzung 8: Zeichnen in Java Sommersemester 2004 Jan Drewnak 29.06.2004 Sitzung 8 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) 29.06.2004 Zeichnen in Java Die Klasse Component • Component ist eine abstrakte Klasse (die paint-Methode ist nicht implementiert) • Alle GUI-Elemente überschreiben die paintMethode und malen sich selbst: • Ein Button zeichnet in paint einen Button • Ein TextField zeichnet in paint den Text • ... 29.06.2004 Zeichnen in Java Zeichnen von AWT - Komponenten AWT-Komponenten zeichnen sich mit Hilfe der paint() Methode selbst. Sequentieller Aufruf von: • repaint() • update() • paint() 29.06.2004 Zeichnen in Java 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 • […] 29.06.2004 Zeichnen in Java 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. 29.06.2004 Zeichnen in Java 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 29.06.2004 Zeichnen in Java 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 29.06.2004 Zeichnen in Java Die Klasse Graphics • Graphics kapselt alle Zeichen-Operationen • Die Klasse ist abstrakt • Zeichnet direkt in den Bildschirmspeicher 29.06.2004 Zeichnen in Java 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 29.06.2004 Zeichnen in Java 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); } } 29.06.2004 Zeichnen in Java Graphics - example GISFrame(String s) { ... // add components: contentPane.add(new GISViewer()); .... } 29.06.2004 Zeichnen in Java 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 29.06.2004 Zeichnen in Java Koordinatentransformation • Jedes Grafik-Objekt “lebt” in einem BildschirmKoordinatensystem (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 29.06.2004 Zeichnen in Java Koordinatentransformation u y x v Probleme: • unterschiedliche Orientierung • unterschiedliche Skalen der beiden Koordinatensysteme v 29.06.2004 Zeichnen in Java u Arten von Transformationen 29.06.2004 Zeichnen in Java Arten von Transformationen • Translationen T (Verschiebung) • Rotationen R (Drehung) • Skalierungen M (Maßstabsänderung) • Scherung S • Affintransformationen: T, R, M, S 29.06.2004 Zeichnen in Java Affine Transformationen • verbreitete Transformation zwischen allen Punkten einer Ebene • erfordert 6 Parameter (in 2D) 29.06.2004 Zeichnen in Java Affine Transformationen u m00 x m01 y m02 v m10 x m11 y m12 u m00 v m10 m01 x m02 m11 y m12 • m00, m11 : Streckungs-/Stauchungsfaktoren • m01, m10 : Scherfaktoren • m02, m12 : Translation (Verschiebung) u m00 v m10 1 0 29.06.2004 m01 m11 0 m02 x m12 y 1 1 Zeichnen in Java Transformationen in Java Graphics2D • 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; 29.06.2004 Zeichnen in Java Transformationen in Java • class AffineTransform • 6 Parameter, einzeln setzbar: • set-/getScaleX, -ScaleY => m00, m11 • set-/getShearX, -ShearY => m01, m10 • set-/getTranslateX, -TranslateY => m02, m12 29.06.2004 Zeichnen in Java 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()); } 29.06.2004 Zeichnen in Java Zu Aufgabe 6 • Zunächst Realisierung des in diesen Folien enthaltenen Beispiels (Malen des Rechtecks) • Machen Sie sich klar wie der Algorithmus für eine Transformation von Geokoordinaten in Bildschirmkoordinaten aussieht! • Zum Nachlesen im Tutorial : Overview of the Java 2D API • Abgabe am Samstag, 17.07.2004 29.06.2004 Zeichnen in Java