Sitzung 8

Werbung
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
Herunterladen