Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
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 12 JavaFX
Pfeil 12.1 Das erste Programm mit JavaFX
Pfeil 12.2 Zentrale Typen in JavaFX
Pfeil 12.2.1 Szenegraph-Knoten und Container-Typen
Pfeil 12.2.2 Datenstrukturen
Pfeil 12.3 JavaFX-Komponenten und Layout-Container-Klassen
Pfeil 12.3.1 Überblick über die Komponenten
Pfeil 12.3.2 Listener/Handler zur Ereignisbeobachtung
Pfeil 12.3.3 Panels mit speziellen Layouts
Pfeil 12.4 Webbrowser
Pfeil 12.5 Geometrische Objekte
Pfeil 12.5.1 Linien und Rechtecke
Pfeil 12.5.2 Kreise, Ellipsen, Kreisförmiges
Pfeil 12.5.3 Es werde kurvig – quadratische und kubische Splines
Pfeil 12.5.4 Pfade *
Pfeil 12.5.5 Polygone und Polylines
Pfeil 12.5.6 Beschriftungen, Texte, Fonts
Pfeil 12.5.7 Die Oberklasse Shape
Pfeil 12.6 Füllart von Formen
Pfeil 12.6.1 Farben mit der Klasse Color
Pfeil 12.7 Grafiken
Pfeil 12.7.1 Klasse Image
Pfeil 12.7.2 ImageView
Pfeil 12.7.3 Programm-Icon/Fenster-Icon setzen
Pfeil 12.7.4 Zugriff auf die Pixel und neue Pixel-Bilder *
Pfeil 12.8 Deklarative Oberflächen mit FXML
Pfeil 12.9 Diagramme (Charts)
Pfeil 12.9.1 Kuchendiagramm
Pfeil 12.9.2 Balkendiagramm
Pfeil 12.10 Animationen
Pfeil 12.10.1 FadeTransition
Pfeil 12.10.2 ScaleTransition
Pfeil 12.10.3 Transitionen parallel oder sequenziell durchführen
Pfeil 12.11 Medien abspielen
Pfeil 12.12 Das Geometry-Paket *
Pfeil 12.13 JavaFX-Scene in Swing-Applikationen einbetten
Pfeil 12.14 Zum Weiterlesen
 
Zum Seitenanfang

12.7Grafiken Zur vorigen ÜberschriftZur nächsten Überschrift

Bilder sind neben dem Text das wichtigste visuelle Gestaltungsmittel. In Java können Grafiken an verschiedenen Stellen eingebunden werden, so zum Beispiel als Grafiken in Zeichengebieten (Canvas) oder als Icons in Schaltflächen, die angeklickt werden. Über Java können problemlos GIF-, PNG- und JPEG-Bilder geladen werden.

JavaFX bietet ein eigenes Paket javafx.scene.image mit diversen Typen rund um Bilder.

[»]Hinweis

Das GIF-Format (Graphics Interchange Format) ist ein komprimierendes Verfahren, das 1987 von CompuServe-Betreibern zum Austausch von Bildern entwickelt wurde. GIF-Bilder können bis zu 1.600 × 1.600 Punkte umfassen. Die Komprimierung nach einem veränderten LZW[ 109 ](Benannt nach den Erfindern Lempel, Ziv und Welch.)-Packverfahren hat keinen Einfluss auf die Bildqualität (sie ist verlustfrei). Jedes GIF-Bild kann aus maximal 256 Farben bestehen – bei einer Palette aus 16,7 Millionen Farben. Entsprechend dem Standard von 1989 können mehrere GIF-Bilder in einer Datei gespeichert werden. JPEG-Bilder sind dagegen in der Regel verlustbehaftet, und das Komprimierungsverfahren speichert die Bilder mit einer 24-Bit-Farbpalette. Der Komprimierungsfaktor kann prozentual eingestellt werden.

 
Zum Seitenanfang

12.7.1Klasse Image Zur vorigen ÜberschriftZur nächsten Überschrift

JavaFX repräsentiert Grafiken als javafx.scene.image.Image-Objekte. Über den Konstruktor der Image-Klasse wird eine Quelle angegeben, woher die Daten für das Bild kommen. Die beiden populären Konstruktoren sind:

  • Image(InputStream is)

  • Image(String url)

Ist die Grafik geladen, können Eigenschaften wie Höhe und Breite über Getter und auch über JavaFX-Properties erfragt werden.

Die Klasse Image repräsentiert das Bild, aber es ist kein Knoten für den Szenegraphen. Image-Objekte werden in JavaFX an unterschiedlicher Stelle eingesetzt:

  • als Grafik für die Fensterdekoration

  • als Vorgabe für den Maus-Cursor (javafx.scene.ImageCursor)

  • als Bild, das auf eine Zeichenfläche (javafx.scene.canvas.Canvas) gemalt wird

  • bei Effekten

  • als Objekt, wenn eine Grafik im der Zwischenablage ist

[»]Hinweis

Die Klasse Image hat in JavaFX zwei Funktionen: Einmal lädt sie Bilder, und einmal repräsentiert sie Bilder. Das ist in AWT/Swing anders, hier gibt es mit Image eine Bildrepräsentation, aber das Laden/Speichern übernehmen andere Klassen, etwa ImageIO.

 
Zum Seitenanfang

12.7.2ImageView Zur vorigen ÜberschriftZur nächsten Überschrift

Um eine Grafik in den Szenegraphen zu hängen, wird sie in eine ImageView verpackt; ImageView ist eine direkte Unterklasse von Node. Zum Aufbau gibt es drei Konstruktoren:

  • ImageView()

  • ImageView(Image image)

  • ImageView(String url)

Die Grafik kann mit den JavaFX-Properties fitHeight und fitWidth (beide DoubleProperty) in eine Box gepresst werden. Eine Skalierung geschieht automatisch, und die BooleanProperty preserveRatio bestimmt, ob das Verhältnis von Breite zu Höhe gleich bleibt. Eine weitere BooleanProperty smooth sagt, ob eine bessere oder schnellere Variante zur Berechnung einer skalierten Version verwendet werden soll. Mit einem Viewport lässt sich ein Teil der Grafik zeigen.

[zB]Beispiel

Erzeuge eine ImageView mit einer Grafik image. Zeige von der Grafik einen Ausschnitt (Viewport), und skaliere die Grafik auf 200 Pixel in der Höhe, wobei sich die Breite im Verhältnis mit ändern soll. Die Skalierung soll eine gute Qualität haben und das Ergebnis aus Performance-Gründen im Cache gehalten werden.

ImageView node = new ImageView( image );
Rectangle2D viewportRect = new Rectangle2D( 10, 10, 80, 80 );
node.setViewport( viewportRect );
node.setFitHeight( 200 );
node.setPreserveRatio( true );
node.setSmooth( true );
node.setCache( true );

Icon-Sammlungen *

Wer für seine grafischen Oberflächen Icons einsetzt, der findet beim Tango Desktop Projekt (http://tango.freedesktop.org/) viele Standard-Icons in den Auflösungen 16 × 16, 22 × 22, 32 × 32 und ebenso im SVG-Format. Die Website http://www.iconfinder.net/ bietet eine Suche nach bestimmten Begriffen und findet freie Icons nach weiteren Kriterien wie Hintergrundfarbe/Transparenz, Größe wie auch kommerziell nutzbare Icons. Crystal Clear (http://commons.wikimedia.org/wiki/Crystal_Clear) steht unter der Lizenzform LGPL und ist damit auch für kommerzielle Anwendungen nutzbar.

 
Zum Seitenanfang

12.7.3Programm-Icon/Fenster-Icon setzen Zur vorigen ÜberschriftZur nächsten Überschrift

Zumindest unter Windows ist jedem Fenster ein kleines Bildchen zugeordnet, das ganz links in der Titelzeile untergebracht ist. Das Programm-Icon lässt sich in JavaFX über das Stage-Objekt ändern; wir erinnern uns, dieses Objekt wird in der JavaFX-Startmethode start(Stage stage) übergeben. Die Stage hat assoziierte Icons, die mit getIcons() erfragt werden, das Ergebnis ist vom Typ ObservableList<Image>. Interessant ist die Tatsache, dass es nicht nur ein Icon geben kann, sondern mehrere. Eine Grafik der Größe 16 × 16 Pixel ist sinnvoll, doch auch größere Größen sind angebracht, weil das Icon auch beim Minimieren der Anwendung gezeigt wird. Jedes Icon wird aber immer auf die notwendige Größe skaliert.

[zB]Beispiel

Setze ein Programm-Icon:

Image programIcon = …
stage.getIcons().add( programIcon );
 
Zum Seitenanfang

12.7.4Zugriff auf die Pixel und neue Pixel-Bilder * Zur vorigen ÜberschriftZur nächsten Überschrift

Die Klasse Image hat keine Methode zum Abfragen und Setzen eines Farbwerts an einer bestimmten Koordinate, das ist ausgelagert in die Extratypen PixelReader und PixelWriter.

Klasse PixelReader

Ein Image-Objekt liefert mit getPixelReader() diesen PixelReader, und dann sind zum Beispiel mit int getArgb(int x, int y) und Color getColor(int x, int y) Abfragen möglich oder auch ganze Bereichsanfragen mit Feld-Rückgabe.

[zB]Beispiel

Lies die Farbwerte eines Image-Objekts image, und zerlege die Rückgabe in die Farbwerte Rot, Grün, Blau und den Alpha-Wert:

int argb = image.getPixelReader().getArgb( x, y );
int alpha = (argb >> 24) & 0xff;
int red = (argb >> 16) & 0xff;
int green = (argb >> 8) & 0xff;
int blue = (argb) & 0xff;

Die Methode getArgb(…) liefert als Rückgabe einen Wert im Standard-RGB-Modell – unabhängig von der tatsächlichen physikalischen Kodierung – und im Standard-RGB-Farbraum. Sind nur die rohen Farbwerte nötig, würde auch getColor(…) zum Ziel führen, doch hier hätten wir es immer mit einem Zwischenobjekt zu tun, was bei vielen Abfragen nicht so optimal ist.

Ausblick

Grafiken müssen im Speicher repräsentiert werden und dafür gibt es ein Speichermodell. Anschaulich gesagt drückt es aus, wie im Speicher die Farbinformationen eines Bildes abgelegt sind, ob etwa je 8 Bit für Rot/Grün/Blau oder ob, wie bei GIF, ein Index und eine Farbtabelle verwendet werden. JavaFX ist bei den Farb- und Speichermodellen flexibel und abstrahiert in einen Typ javafx.scene.image.PixelFormat.

WritableImage und PixelWriter

Nicht immer kommen die Bilder vom Datensystem oder aus dem Internet. Mit der JavaFX-Bibliothek lassen sich einfach neue Grafiken anlegen und die Pixel setzen. Dazu bietet JavaFX eine Unterklasse von Image, und zwar WritableImage. Während Image selbst immutable ist, erlaubt WritableImage eine Veränderung der Pixel.

Da WritableImage von Image erbt, erbt es auch alle Eigenschaften und Properties, wie etwa getPixelReader(). Es kommen nur drei Konstruktoren und eine Methode hinzu, die Klasse ist also schlank:

class javafx.scene.image.WritableImage
extends Image
  • WritableImage(int width, int height)

  • WritableImage(PixelReader reader, int width, int height)

  • WritableImage(PixelReader reader, int x, int y, int width, int height)
    Initialisiert ein WritableImage mit einer Größe. Ein anderes Bild kann von einem PixelReader übernommen werden, es entsteht also eine Kopie.

  • PixelWriter getPixelWriter()
    Liefert einen PixelWriter, der schreibenden Zugriff auf die Pixel des Bildes ermöglicht.

Bei WritableImage finden wir die Methode getPixelWriter(), die symmetrisch ist zum PixelReader und entsprechende getXXX(…)-Methode bietet.

Ein Beispiel zum Lesen und Schreiben von Pixeln

Das folgende Programm lädt ein Bild und setzt einen Bewegungssensor an die ImageView, in der ein WritableImage eingebettet ist. Bewegt der Nutzer den Mauszeiger über das Bild, erfragen wir den Farbwert unter der Koordinate und lassen uns über die Color-Klasse einen invertierten Farbton geben, womit wir den vorherigen Farbwert für das Pixel überschreiben:

Listing 12.11com/tutego/insel/javafx/WritableImageDemo.java, getImageView()

private ImageView getImageView( String filename ) {
try ( InputStream stream = getClass().getResourceAsStream( filename ) ) {
if ( stream == null )
return new ImageView();

Image img1 = new Image( stream );
final WritableImage img2 = new WritableImage( img1.getPixelReader(),
(int) img1.getWidth(), (int) img1.getHeight() );
ImageView imageView = new ImageView( img2 );

imageView.setOnMouseMoved( new EventHandler<MouseEvent>() {
@Override public void handle( MouseEvent e ) {
Color c = img2.getPixelReader().getColor( (int) e.getX(), (int) e.getY() );
img2.getPixelWriter().setColor( (int) e.getX(), (int) e.getY(), c.invert() );
}
} );
return imageView;
}
catch ( IOException e ) { // Exception von close()
throw new UncheckedIOException( e );
}
}
Screenshot der Anwendung WritableImageDemo

Abbildung 12.10Screenshot der Anwendung WritableImageDemo

 


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
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.

 
Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern