12.6Füllart von Formen
Ist eine Form gefüllt, so gibt es verschiedene Möglichkeiten, diese Füllung zu beschreiben, wofür JavaFX den Typ javafx.scene.paint.Paint deklariert. Folgende Klassen aus dem javafx.scene. paint-Paket erweitern sie:
Color: Repräsentiert sRGB-Farben und Alpha-Werte (Transparenz). Das ist die übliche Füllung.
ImagePattern: Füllt Formen mit einer Kachel aus Grafiken.
LinearGradient, RadialGradient: Füllen Formen mit Farbverläufen.
Die Zuweisung eines Paint-Objekts übernehmen Methoden wie setFill(Paint) oder setStroke(Paint).
Bemerkung
Viele Formen werden standardmäßig gefüllt. Ist keine Füllung gewünscht, ist ein setFill(null) nötig.
12.6.1Farben mit der Klasse Color
Der Einsatz von Farben und Transparenzen ist in Java-Programmen dank der Klasse Color einfach. Ein javafx.scene.paint.Color-Objekt repräsentiert einen Wert aus dem sRGB-Farbraum (Standard-RGB), andere Farbräume sind nicht vorgesehen.
Die Klasse Color stellt Konstanten für Standardfarben und einige Fabrikmethoden (keine Konstruktoren) sowie Anfragemethoden bereit. Außerdem gibt es Methoden, die abgewandelte Color-Objekte liefern – das ist nötig, da Color-Objekte wie String immutable sind. Die wichtigsten Methoden zum Erzeugen von Color-Objekten sind:
extends Paint
implements Interpolatable<Color>
static Color color(double red, double green, double blue)
static Color color(double red, double green, double blue, double opacity)
static Color rgb(int red, int green, int blue)
static Color rgb(int red, int green, int blue, double opacity)
Liefert ein neues Color-Objekt aus den Bestandteilen Rot, Grün, Blau, einmal im Wertebereich 0.0 bis 1.0 und dann bei dem Parametertyp int im Bereich 0 bis 255.
Des Weiteren sind für hexadezimalkodierte Farben der Form #rrggbb die Methoden web(String colorString) – synonym dazu valueOf(String) – und web(String colorString, double opacity) deklariert. Bei Angabe von Farbton (auch Tönung genannt), Sättigung und Helligkeit sind hsb(double hue, double saturation, double brightness) und hsb(double hue, double saturation, double brightness, double opacity) von Nutzen. Die web(…)-Methode erlaubt die gleichen Strings wie auch bei CSS, so sind gültig web("#f68", 0.5) – was color(1.0, 0.4, 0.8, 0.5) entspricht – oder web("rgb(255,50%,50%,0.25)", 0.5) – was gleichkommt mit color(1.0, 0.5, 0.5, 0.125).
Daneben gibt es zur Erzeugung von Grautönen ein paar Spezialmethoden: gray(double gray), gray(double gray, double opacity), grayRgb(int gray), grayRgb(int gray, double opacity).
[»]Hinweis
Menschen unterscheiden Farben an den drei Eigenschaften Farbton, Helligkeit und Sättigung. Die menschliche Farbwahrnehmung kann etwa 200 Farbtöne unterscheiden. Diese werden durch die Wellenlänge des Lichts bestimmt. Die Lichtintensität und Empfindlichkeit unserer Rezeptoren lässt uns etwa 500 Helligkeitsstufen unterscheiden. Bei der Sättigung handelt es sich um eine Mischung mit weißem Licht. Hier erkennen wir etwa 20 Stufen. Unser visuelles System kann somit ungefähr 2 Millionen (200 × 500 × 20) Farbnuancen unterscheiden.
Zufällige Farbblöcke zeichnen
Um die Möglichkeiten der Farbgestaltung einmal zu beobachten, betrachten wir die Ausgabe eines Programms, das Rechtecke mit wahllosen Farben anzeigt:
Listing 12.10com/tutego/insel/javafx/ColorDemo.java, start(…)
stage.setResizable( true );
stage.setScene( new Scene( group, 800, 800 ) );
Random r = new Random();
for ( int y = 12; y < stage.getScene().getHeight() - 25; y += 30 )
for ( int x = 12; x < stage.getScene().getWidth() - 25; x += 30 ) {
Rectangle rect = new Rectangle( x, y, 25, 25 );
Color color = Color.rgb( r.nextInt( 256 ), r.nextInt( 256 ), r.nextInt( 256 ) );
rect.setFill( color );
rect.setStroke( color.grayscale() );
group.getChildren().add( rect );
}
Das Fenster der Applikation hat eine gewisse Größe, die wir später in der Breite und Höhe abfragen, falls wir die Fensterausmaße einmal ändern wollen. Anschließend erzeugen wir Blöcke, die mit einer zufälligen Farbe gefüllt sind. setFill(…) übernimmt diese Aufgabe. Für den Rahmen der gefüllten Rechtecke setzen wir die Zeichenstiftfarbe mit der Methode setStroke(…). Die Farbe des Randes leiten wir von der Zufallsfarbe ab.
Abbildung 12.9Programmierter Neoplastizismus
Vordefinierte Farben
Wenn wir Farben benutzen wollen, sind schon an die 150 Werte vordefiniert, wie Color.WHITE, Color.PLUM. Für eine genauere Übersicht lohnt ein Blick in die Javadoc; neben den Farbkonstanten zeigt die Webseite auch ein Rechteck in der Farbe selbst. Die Farbnamen können auch in den Strings verwendet werden, da es bekannte HTML/CSS-Farben sind, etwa über Color.web("orange").
Farbanteile zurückgeben
Mitunter müssen wir den umgekehrten Weg gehen und von einem gegebenen Color-Objekt wieder die Rot-, Grün-, Blau- oder Transparenzanteile extrahieren. Dies ist einfach, und die JavaFX-Bibliothek bietet Entsprechendes an:
extends Paint
implements Interpolatable<Color>
int getRed()
int getGreen()
int getBlue()
Liefert Rot-, Grün- und Blau-Anteile des Farbobjekts im Bereich von 0 bis 255.int getOpacity()
Gibt den Alpha-Anteil zurück.boolean isOpaque()
Ist die Farbe komplett durchgängig?int getHue()
int getSaturation()
int getbrightness()
Liefert Farbton, Sättigung und Helligkeit.
Eine Methode wie int getRGB(), die die RGB-Farbe auf einen Schlag zurückgibt, existiert merkwürdigerweise nicht.
Die Farbmodelle HSB und RGB *
Zwei Farbmodelle sind in der Computergrafik geläufig: das RGB-Modell, bei dem die Farben durch einen Rot-, Grün- und Blau-Anteil definiert werden, und das HSB-Modell, das die Farben durch Farbton (engl. hue), Farbsättigung (engl. saturation) und Helligkeit (engl. brightness) definiert. Die Farbmodelle können die gleichen Farben beschreiben und ineinander umgerechnet werden. Dazu wird zunächst das Color-Objekt entweder mit color(…) oder mit hsb(…) aufgebaut und dann mit den gegenteiligen getXXX()-Methoden erfragt. Direkte Umrechenmethoden gibt es nicht.
Farbtöne ableiten
brighter() und darker() liefern ein Farbobjekt zurück, das jeweils eine Farbnuance heller bzw. dunkler ist. Diese beiden Methoden sind nützlich, um zum Beispiel bei angedeuteten 3D-Objekten die Ränder in hellerem oder dunklerem Farbton zu zeichnen.
desaturate() ist eine Methode, die die Sättigung herausnimmt, saturate() verstärkt sie. grayscale() konvertiert komplett die Farbe in einen Grauton, und invert() dreht die Farbe um. Eine besondere Methode ist interpolate(Color endValue, double t), die eine Farbe liefert, die von dem gegebenen Startwert hin zum Endwert laufen kann, wobei t von 0 bis 1 geht und sagt, wie nahe die Zielfarbe am Start- bzw. Endwert liegt.