sitzung 8: zeichnen in java
DESCRIPTION
Sitzung 8: Zeichnen in Java. 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). Die Klasse Component. - PowerPoint PPT PresentationTRANSCRIPT
•
29.06.2004 Sitzung 8
Sommersemester 2004Jan Drewnak
Entwicklung und Einsatzvon Geosoftware I
Praktikum
Sitzung 8: Zeichnen in Java
29.06.2004 Zeichnen in Java
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 paint-Methode 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.update(Graphics g)
Component.getGraphics()
• 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.update(Graphics g)
Component.paint(Graphics g)
Component.getGraphics()
• 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 - exampleclass 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 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
29.06.2004 Zeichnen in Java
Koordinatentransformation
x
y
v
u
v
u
Probleme:• unterschiedliche Orientierung• unterschiedliche Skalender beiden Koordinatensysteme
29.06.2004 Zeichnen in Java
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
• m00, m11 : Streckungs-/Stauchungsfaktoren
u m x m y m
v m x m y m
00 01 02
10 11 12
u
v
m m
m m
x
y
m
m
00 01
10 11
02
12
• m01, m10 : Scherfaktoren
• m02, m12 : Translation (Verschiebung)
u
v
m m m
m m m
x
y
1 0 0 1 1
00 01 02
10 11 12
29.06.2004 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
import java.awt.geom.*;... void updateTransformation(){
//initialize transformationaf.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()); }
import java.awt.geom.*;... void updateTransformation(){
//initialize transformationaf.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()); }
Beispiel Transformationen
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