FH-Hof Java2D Richard Göbel. FH-Hof Java2D - Funktionen Java2D unterstützt: das Zeichnen von...

Preview:

Citation preview

FH-Hof

Java2D

Richard Göbel

FH-Hof

Java2D - Funktionen

Java2D unterstützt:

das Zeichnen von Grafiken

die Darstellung von Texten

die Darstellung von Bildern

Java2D bildet die Basis für die Definition

eigener Komponenten

Java2D unterstützt das Drucken

FH-Hof

Java2D - Ansatz

Definition einer Unterklasse für eine

Komponente ohne Inhalt, zum Beispiel:

Canvas (AWT)

JPanel (Swing)

JComponent (Swing)

Definition der Method „paint“ in dieser

Unterklasse

Die Methode „paint“ wird automatisch bei dem

(Neu-) Zeichnen der Grafik aufgerufen

FH-Hof

Aufbau einer Klasse für eine Grafik

public class <className> extends JComponent

{

// Attribute mit den zu zeichnenden Daten

. . .

public void paint (Graphics g)

{

Graphics2D g2 = (Graphics2D) g;

// ab hier wird gezeichnet

. . .

}

. . .

}

FH-Hof

Inhalt der Methode „paint“

Zeichenmethoden für Graphics2D:

draw Zeichnen grafischer Objekte

fill Füllen grafischer Objekte

Grafische Objekte

Rectangle2D

Ellipse2D

. . .

Kontext für das Zeichnen

Klasse „Stroke“ ist der Zeichenstift: Breite, Höhe,

etc.

Klasse „Paint“ ist die Farbe

. . .

FH-Hof

Koordinatensystem

100

200

100

200

FH-Hof

Ausgabe eines Rechtecks

public class myRectangle extends JComponent

{

Rectangle2D.Float s = new Rectangle2D.Float(10,10,100,200);

public void paint (Graphics g)

{

Graphics2D g2 = (Graphics2D) g;

g2.setStroke(new BasicStroke(1));

g2.draw(s);

}

}

FH-Hof

Einfache Graphische Objekte: Klassen

Linie: Line2D, Line2D.Float, Line2D.Double

Quadratische Kurve: QuadCurve2D.Float,

QuadCurve2D.Double

Kubische Kurve: CubicCurve2D.Float,

CubicCurve2D.Double

Rechtecke: Rectangle2D.Float,

Rectangle2D.Double

Ellipse: Ellipse2D.Float, Ellipse2D.Double

Segment einer Ellipse: Arc2D.Float, Arc2D.Double

FH-Hof

Einfache Grafische Objekte: Darstellung Teil 1

Line2D.Float(float x1, float y1, float x2, float y2)

QuadCurve2D.Float(float x1, float y1, float cx, float cy, float x2, float y2)

(x1, y1)

(x2, y2)

CubicCurve2D.Float(float x1, float y1,

float cx1, float cy1,

float cx2, float cy2,

float x2, float y2)

(x1, y1) (x2, y2)

(cx1, cy1)

(cx2, cy2)

(cx1, cy1)

(x1, y1)

(x2, y2)

FH-Hof

Einfache Grafische Objekte: Darstellung Teil 2

Rectangle2D.Float(float x, float y,

float w, float h)

Ellipse2D.Float(float x, float y, float w, float h)

(x, y)

w

h

(x, y)

w

h

FH-Hof

Einfache Grafische Objekte: Darstellung Teil 3

Arc2D.Float(float x, float y, float w, float h, float s, float e, int type)

(x, y)

w

hse

type = CHORD type = OPENtype = PIE

FH-Hof

Kombination von Objekten: GeneralPath

p = new GeneralPath();

p.moveTo(x1,y1);

p.lineTo(x2,y2);

p.quadTo(cx, cy,

x3,y3);

p.lineTo(x4,y4);

(x1, y1)

(x2, y2)

(x3, y3)

(x4, y4)

(cx, cy)

FH-Hof

Kombination von Objekten: AREA

a1 = new Area(new Rectangle2D.Float( . . . )

a2 = new Area(new Rectangle2D.Float( . . . )

a1.add(a2) a1.exclusiveOr(a2)

a1.intersect(a2) a1.subtract(a2)

FH-Hof

Bestandteile des Kontext

Zeichenstift: Stroke

Füllfarbe: Paint

Transformationen: AffineTransform

Weitere Attribute:

Hintergrund

Rendering Hints

Clip-Bereich

FH-Hof

Zeichenstift

Basis: Interface Stroke

Implementierende Klasse: BasicStroke

Parameter für die Klasse BasicStroke:

Breite

Gestaltung von Ecken

Muster für gestrichelte Linien

Setzen des Zeichenstifts

<graphics2d>.setStroke(new BasicStroke(. . .))

FH-Hof

Konstruktoren für die Klasse BasicStroke

BasicStroke( float width)

BasicStroke( float width,

int cap,

int join)

BasicStroke( float width,

int cap,

int join,

float miterlimit,

float[] dash,

float dash_phase)

FH-Hof

Ende einer Linie: Parameter „cap“

CAP_BUTT

CAP_SQUARE

CAP_BUTT

FH-Hof

Ende einer Linie: Parameter „join“

JOIN_BEVEL

JOIN_MITER

JOIN_ROUND

FH-Hof

Muster für gestrichelte Linien: Parameter dash

Für den Parameter „dash“ wird ein Array für

den Datentyp „float“ erwartet

Das Array muss eine gerade Anzahl von

Elementen enthalten

Die Länge der Liniensegmente wird mit den

geraden Elementen definiert

Die Länge der Zwischenräume wird mit den

ungeraden Elementen definiert

Der Startpunkt innerhalb des Musters wird mit

Hilfe des Parameters „dashphase“ festgelegt,

FH-Hof

Beispiel für eine gestrichelte Linie

float[] pattern = { 1, 19, 10, 10 }

FH-Hof

Füllfarbe: Optionen

Einheitliche Farbe mit der Klasse „Color“, z.B.:

Color(float r, float g, float b)

Farbverlauf mit der Klasse „GradientPaint“, z.B.:

GradientPaint(float x1, float y1, Color col1,

float x2, float y2, Color col2,

boolean cyclic)

Textur mit der Klasse „TexturePaint“, z.B.:

TexturePaint(BufferedImage txtr,

Rectangle2d anchor)

Setzen der Füllfarbe:

<graphics2d>.setPaint( . . . )

FH-Hof

Beispiele für Füllfarbe

new Color(1f,1f,0f) new TexturePaint(...)

new GradientPaint(30, 40, new Color(1f,0,0), 60, 70, new Color(0,1f,0), ...)

cyclic = false cyclic = true

FH-Hof

Transformationen

Auf alle Punkte eines zu zeichnenden Objekts

wird zunächst eine Transformation angewendet

Mit diesem Ansatz lassen sich verschiedene

Ausgabemedien unterstützen:

Bildschirm

Drucker

Palm

. . .

Die Transformation wird mit Hilfe einer 3 3

Matrix als Objekt der Klasse

„AffineTransformation“ dargestellt

FH-Hof

Methoden von Graphics2D für Transformationen

Änderung der aktuellen Transformation

rotate(double theta, double x, double y)

scale(double sx, double sy)

shear(double shx, double shy)

translate(double tx, double ty)

Neue Transformation setzen

setTransform(AffineTransform Tx)

FH-Hof

Statische Funktionen von AffineTransformation

getRotateInstance(double theta, double x,

double y)

getScaleInstance(double sx, double sy)

getShearInstance(double shx, double shy)

getTranslateInstance(double tx, double ty)

Recommended