Java SE 8 Standard-Bibliothek  
Professionelle Bücher. Auch für Einsteiger.
 
Inhaltsverzeichnis

Vorwort
1 Neues in Java 8 und Java 7
2 Fortgeschrittene String-Verarbeitung
3 Threads und nebenläufige Programmierung
4 Datenstrukturen und Algorithmen
5 Raum und Zeit
6 Dateien, Verzeichnisse und Dateizugriffe
7 Datenströme
8 Die eXtensible Markup Language (XML)
9 Dateiformate
10 Grafische Oberflächen mit Swing
11 Grafikprogrammierung
12 JavaFX
13 Netzwerkprogrammierung
14 Verteilte Programmierung mit RMI
15 RESTful und SOAP-Web-Services
16 Technologien für die Infrastruktur
17 Typen, Reflection und Annotationen
18 Dynamische Übersetzung und Skriptsprachen
19 Logging und Monitoring
20 Sicherheitskonzepte
21 Datenbankmanagement mit JDBC
22 Java Native Interface (JNI)
23 Dienstprogramme für die Java-Umgebung
Stichwortverzeichnis

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java SE 8 Standard-Bibliothek von Christian Ullenboom
Das Handbuch für Java-Entwickler
Buch: Java SE 8 Standard-Bibliothek

Java SE 8 Standard-Bibliothek
Pfeil 11 Grafikprogrammierung
Pfeil 11.1 Grundlegendes zum Zeichnen
Pfeil 11.1.1 Die paint(Graphics)-Methode für das AWT-Frame
Pfeil 11.1.2 Die ereignisorientierte Programmierung ändert Fensterinhalte
Pfeil 11.1.3 Zeichnen von Inhalten auf ein JFrame
Pfeil 11.1.4 Auffordern zum Neuzeichnen mit repaint(…)
Pfeil 11.1.5 Java 2D-API
Pfeil 11.2 Einfache Zeichenmethoden
Pfeil 11.2.1 Linien
Pfeil 11.2.2 Rechtecke
Pfeil 11.2.3 Ovale und Kreisbögen
Pfeil 11.2.4 Polygone und Polylines
Pfeil 11.3 Zeichenketten schreiben und Fonts
Pfeil 11.3.1 Zeichenfolgen schreiben
Pfeil 11.3.2 Die Font-Klasse
Pfeil 11.3.3 Font-Metadaten durch FontMetrics *
Pfeil 11.4 Geometrische Objekte
Pfeil 11.4.1 Die Schnittstelle Shape
Pfeil 11.4.2 Pfade *
Pfeil 11.5 Das Innere und Äußere einer Form
Pfeil 11.5.1 Farben und die Paint-Schnittstelle
Pfeil 11.5.2 Farben mit der Klasse Color
Pfeil 11.5.3 Composite und XOR *
Pfeil 11.5.4 Dicke und Art der Linien von Formen bestimmen über Stroke *
Pfeil 11.6 Bilder
Pfeil 11.6.1 Eine Übersicht über die Bilder-Bibliotheken
Pfeil 11.6.2 Bilder mit ImageIO lesen
Pfeil 11.6.3 Ein Bild zeichnen
Pfeil 11.6.4 Splash-Screen *
Pfeil 11.6.5 Bilder skalieren *
Pfeil 11.6.6 Schreiben mit ImageIO
Pfeil 11.6.7 Asynchrones Laden mit getImage(…) und dem MediaTracker *
Pfeil 11.7 Weitere Eigenschaften von Graphics *
Pfeil 11.7.1 Eine Kopie von Graphics erstellen
Pfeil 11.7.2 Koordinatensystem verschieben
Pfeil 11.7.3 Beschnitt (Clipping)
Pfeil 11.7.4 Zeichenhinweise durch RenderingHints
Pfeil 11.7.5 Transformationen mit einem AffineTransform-Objekt
Pfeil 11.8 Drucken *
Pfeil 11.8.1 Drucken der Inhalte
Pfeil 11.8.2 Bekannte Drucker
Pfeil 11.9 Benutzerinteraktionen automatisieren, Robot und Screenshots *
Pfeil 11.9.1 Der Roboter
Pfeil 11.9.2 Automatisch in die Tasten hauen
Pfeil 11.9.3 Automatisierte Maus-Operationen
Pfeil 11.9.4 Methoden zur Zeitsteuerung
Pfeil 11.9.5 Bildschirmabzüge (Screenshots)
Pfeil 11.9.6 Funktionsweise und Beschränkungen
Pfeil 11.9.7 MouseInfo und PointerInfo
Pfeil 11.10 Zum Weiterlesen
 
Zum Seitenanfang

11.5Das Innere und Äußere einer Form Zur vorigen ÜberschriftZur nächsten Überschrift

Vor dem Zeichnen sammelt das Grafiksystem die Objekte in einem Kontext. Er bestimmt für die Form den Zeichenbereich (engl. clipping), die Transformationen, die Komposition von Objekten. Die diversen drawXXX(…)- und fillXXX(…)-Methoden von Graphics2D berücksichtigen beim Zeichnen Farb- und Texturangaben, Dicken der Umrisslinien, Linienmuster und Weiteres. Unterscheiden müssen wir zwischen zwei Eigenschaften:

  • Umrisslinie (Stroke): Bestimmt zum Beispiel die Dicke der Umrisslinie oder das Zeichenmuster.

  • Füllung (Paint): Wählt dazu etwa Farbe oder Verläufe.

 
Zum Seitenanfang

11.5.1Farben und die Paint-Schnittstelle Zur vorigen ÜberschriftZur nächsten Überschrift

Die Farben für das Innere geben Objekte vom Typ java.awt.Paint an. Paint ist eine Schnittstelle, die unter anderem folgende Klassen aus dem java.awt-Paket implementieren:

  • Color: Repräsentiert sRGB-Farben und Alpha-Werte (Transparenz).

  • GradientPaint, LinearGradientPaint, RadialGradientPaint: Füllt Formen (Shape-Objekte) mit Farbverläufen.

  • TexturePaint: Füllt Formen mit einer Textur.

  • SystemColor: Repräsentiert Farben, wie sie vom Benutzer in den Systemeinstellungen definiert sind.

Der Zuweisung eines Paint-Objekts auf den aktuellen Graphics2D-Kontext dient die Methode setPaint(Paint).

 
Zum Seitenanfang

11.5.2Farben mit der Klasse Color Zur vorigen ÜberschriftZur nächsten Überschrift

Ein java.awt.Color-Objekt repräsentiert üblicherweise einen Wert aus dem sRGB-Farbraum (Standard-RGB), kann aber auch andere Farbräume über den Basistyp java.awt.color.ColorSpace darstellen (wir werden das nicht weiter verfolgen).

Die Klasse Color stellt Konstanten wie BLACK, WHITE, für Standardfarben und einige Konstruktoren sowie Anfragemethoden wie getRed(), … bereit. Außerdem gibt es Methoden, die abgewandelte Color-Objekte liefern – das ist nötig, da Color-Objekte wie String oder File immutable sind.

class java.awt.Color
implements Paint, Serializable
  • Color(float r, float g, float b)
    Erzeugt ein Color-Objekt mit den Grundfarben Rot, Grün und Blau. Die Werte müssen im Bereich 0.0 bis 1.0 liegen, sonst folgt eine IllegalArgumentException.

  • Color(int r, int g, int b)
    Erzeugt ein Color-Objekt mit den Grundfarben Rot, Grün und Blau. Die Werte müssen im Bereich 0 bis 255 liegen, sonst folgt eine IllegalArgumentException.

  • Color(int rgb)
    Erzeugt ein Color-Objekt aus dem rgb-Wert, der die Farben Rot, Grün und Blau kodiert. Der Rotanteil befindet sich unter den Bits 16 bis 23, der Grünanteil in 8 bis 15 und der Blauanteil in 0 bis 7. Da ein Integer immer 32 Bit breit ist, ist jede Farbe durch 1 Byte (8 Bit) repräsentiert. Die Farbinformationen werden nur aus den 24 Bit genommen. Sonstige Werte werden einfach nicht betrachtet und mit einem Alpha-Wert gleich 255 überschrieben.

  • Color(int r, int g, int b, int a)

  • Color(float r, float g, float b, float a)
    Erzeugt ein Color-Objekt mit Alpha-Wert für Transparenz.

  • static Color decode(String nm) throws NumberFormatException
    Liefert die Farbe von nm. Die Zeichenkette ist hexadezimal als 24-Bit-Integer kodiert, etwa #00AAFF.

 
Zum Seitenanfang

11.5.3Composite und XOR * Zur vorigen ÜberschriftZur nächsten Überschrift

Ein Composite ist eine Zusammenfügung der zu zeichnenden Elemente und des Hintergrunds. Auf dem Graphics2D-Objekt setzt setComposite(Composite) den Modus, wobei bisher AlphaComposite die einzige direkte Implementierung der Schnittstelle Composite ist. Ein AlphaComposite-Objekt bestimmt, wie die Überblendung aussehen soll.

[zB]Beispiel

Zeichne ein Bild image mit dem Alpha-Wert alpha:

Graphics2D g2 = (Graphics2D) g;
g2.setComposite( AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha) );
g2.drawImage( image, 0, 0, this );

Der XOR-Modus

Die zweite Einstellung, wie Farben auf das Ziel wirken, bestimmt der XOR-Modus, der ein spezieller Composite ist, mit dem Pixel, die zweimal gezeichnet werden, ihre Ursprungsfarbe wieder annehmen.

abstract class java.awt.Graphics
  • abstract void setComposite(Composite comp)
    Setzt das Composite-Objekt, das die Verschmelzung der folgenden Zeichenoperationen mit dem Hintergrund definiert.

  • abstract void setXORMode(Color c)
    Setzt die Pixel-Operation auf XOR.

 
Zum Seitenanfang

11.5.4Dicke und Art der Linien von Formen bestimmen über Stroke * Zur vorigen ÜberschriftZur nächsten Überschrift

Eine noch fehlende Eigenschaft ist die der Umrisslinie, Stroke genannt. Zu den Eigenschaften einer Umrisslinie zählen:

  • die Dicke (engl. width)

  • die Art, wie Liniensegmente beginnen und enden (engl. end caps)

  • die Art, wie aufeinandertreffende Linien verbunden werden (engl. line joins)

  • ein Linien-Pattern (engl. dash attributes)

Die Stroke-Schnittstelle

Die Umrisseigenschaften bestimmen Objekte vom Typ java.awt.Stroke; die Methode setStroke(Stroke) auf dem Graphics2D-Kontext setzt sie. Alle nachfolgenden Graphics2D-Methoden wie draw(Shape), drawLine(…) usw. berücksichtigen diese Umrisslinie anschließend.

Die Schnittstelle Stroke schreibt nur eine Operation vor:

interface java.awt.Stroke
  • Shape createStrokedShape(Shape p)
    Liefert die Umrandung für ein Shape p.

Bisher gibt es in Java nur eine Standardimplementierung der Schnittstelle: BasicStroke.

[zB]Beispiel

Zeichne die folgenden Formen mit einer Dicke von 10 Pixeln:

g2.setStroke( new BasicStroke( 10 ) );
Vererbungsbeziehung von BasicStroke und Stroke

Abbildung 11.11Vererbungsbeziehung von BasicStroke und Stroke

Linienenden (end caps)

Besonders bei breiten Linien ist es interessant, wie eine allein stehende Linie endet. Sie kann einfach aufhören oder auch abgerundet sein. Drei Konstanten bestimmen diesen Linienende-Typ:

  • BasicStroke.CAP_BUTT: Belässt das Ende so, wie es ist.

  • BasicStroke.CAP_ROUND: Rundet das Ende mit einem Halbkreis ab.

  • BasicStroke.CAP_SQUARE: Setzt einen rechteckigen Bereich an.

Die Typen CAP_ROUND und CAP_SQUARE erweitern die Linie um ein Stück, das halb so groß wie die Dicke der Linie ist:

Listing 11.6com/tutego/insel/ui/g2d/EndCaps.java, paintComponent()

@Override protected void paintComponent( Graphics g ) {
Graphics2D g2 = (Graphics2D) g;

g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

g2.setStroke( new BasicStroke( 20, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER ) );
g2.drawLine( 30, 50, 200, 50 );

g2.setStroke( new BasicStroke( 20, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER ) );
g2.drawLine( 30, 150, 200, 150 );

g2.setStroke( new BasicStroke( 20, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER ) );
g2.drawLine( 30, 100, 200, 100 );
}

Zwar gibt es von BasicStroke fünf Konstruktoren, aber nur einen einfachen, der Linienenden (immer unterschiedlich in dem Beispiel) und Linienverbindungen (hier BasicStroke.JOIN_MITER) gleichzeitig bestimmt haben möchte.

Unterschiedliche Linienenden

Abbildung 11.12Unterschiedliche Linienenden

Linienverbindungen (line joins)

Wenn Linien nicht allein stehen, sondern etwa wie in einem Dreieck oder Rechteck verbunden sind, stellt sich die Frage, wie diese Verbindungspunkte gezeichnet werden. Das bestimmen ebenfalls drei Konstanten:

  • BasicStroke.JOIN_ROUND: Rundet die Ecken ab.

  • BasicStroke.JOIN_BEVEL: Zieht eine Linie zwischen den beiden äußeren Endpunkten.

  • BasicStroke.JOIN_MITER: Erweitert die äußeren Linien so weit, bis sie sich treffen.

Listing 11.7com/tutego/insel/ui/g2d/LineJoins.java, paintComponent()

@Override protected void paintComponent( Graphics g ) {
Graphics2D g2 = (Graphics2D) g;

g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

BasicStroke stroke = new BasicStroke( 20, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_BEVEL );
g2.setStroke( stroke );

Path2D shape = new GeneralPath();
shape.moveTo( 25, 25 );
shape.lineTo( 50, 100 );
shape.lineTo( 75, 25 );
g2.draw( shape );

//
stroke = new BasicStroke( 20, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER );
g2.setStroke( stroke );

shape = new GeneralPath();
shape.moveTo( 25+100, 25 );
shape.lineTo( 50+100, 100 );
shape.lineTo( 75+100, 25 );
g2.draw( shape );

//
stroke = new BasicStroke( 20, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_ROUND );
g2.setStroke( stroke );

shape = new GeneralPath();
shape.moveTo( 25+200, 25 );
shape.lineTo( 50+200, 100 );
shape.lineTo( 75+200, 25 );
g2.draw( shape );
}
Unterschiedliche Linienverbindungen BEVEL, MITER, ROUND

Abbildung 11.13Unterschiedliche Linienverbindungen BEVEL, MITER, ROUND

Falls der Typ der Linienverbindungen JOIN_MITER ist, kann mit einem spitzen Winkel die Verbreiterung sehr lang werden. Die Variable miterlimit beim Konstruktor kann die maximale Länge beschränken, sodass die beiden Linien oberhalb einer gewissen Größe mit JOIN_BEVEL enden.

Füllmuster (dash)

Auch die Muster, mit denen die Linien oder Kurven gezeichnet werden, lassen sich ändern. Dazu erzeugen wir vorher ein float-Feld und übergeben es einem Konstruktor.

Kodierung der Füllmuster

Abbildung 11.14Kodierung der Füllmuster

Die folgenden Zeilen erzeugen ein Rechteck mit einem einfachen Linienmuster. Es sollen zehn Punkte gesetzt und zwei Punkte frei sein. Damit auch die Muster abgerundet werden, muss CAP_ROUND gesetzt sein:

Listing 11.8com/tutego/insel/ui/g2d/DashWithBasicStroke.java, Ausschnitt 1

float[] dash = { 10, 2 };
BasicStroke stroke = new BasicStroke( 2,
BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER,
1,
dash, 0 );

g2.setStroke( stroke );
g2.draw( new Rectangle2D.Float( 50, 50, 50, 50 ) );

Als letztes Argument hängt am Konstruktor von BasicStroke noch eine Verschiebung. Dieser Parameter bestimmt, wie viele Pixel im Muster übersprungen werden sollen. Geben wir dort für unser Beispiel etwa 10 an, so beginnt die Linie gleich mit zwei nicht gesetzten Pixeln. Eine 12 ergibt eine Verschiebung wieder an den Anfang. Bei nur einer Zahl im Feld sind der Abstand der Linien und die Breite einer Linie genauso lang, wie diese Zahl angibt. Bei gepunkteten Linien ist das Feld also 1. Hier eignet sich ein anonymes Feld ganz gut, wie die nächsten Zeilen zeigen:

Listing 11.9com/tutego/insel/ui/g2d/DashWithBasicStroke.java, Ausschnitt 2

stroke = new BasicStroke( 1,
BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1, new float[]{ 1 }, 0 );

Bei feinen Linien sollten wir das Weichzeichnen besser ausschalten.

Zwei Linienmuster

Abbildung 11.15Zwei Linienmuster

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java SE 8 Standard-Bibliothek Java SE 8 Standard-Bibliothek
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Java ist auch eine Insel
Java ist auch eine Insel


Zum Rheinwerk-Shop: Professionell entwickeln mit Java EE 8
Professionell entwickeln mit Java EE 8


Zum Rheinwerk-Shop: Besser coden
Besser coden


Zum Rheinwerk-Shop: Entwurfsmuster
Entwurfsmuster


Zum Rheinwerk-Shop: IT-Projektmanagement
IT-Projektmanagement


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2018. Original - https://www.rheinwerk-verlag.de/openbook/
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 

 
 


28.03.2024 - Sitemap.xml