
FAQ JavaFXConsultez toutes les FAQ
Nombre d'auteurs : 4, nombre de questions : 507, derni�re mise � jour : 2 novembre 2016 Ajouter une question
Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur le forum JavaFX de http://java.developpez.com ainsi que l'exp�rience personnelle des auteurs.
Nous tenons � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant r�dacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture.
- Comment acc�der � une image ?
- Quels sont les formats support�s ?
- Comment afficher une image ?
- Comment changer la taille d'affichage d'une image ?
- Comment afficher une partie d'une image ?
- Comment r�cup�rer la valeur d'un pixel dans une image ?
- Comment modifier la valeur d'un pixel dans une image ?
- Comment faire capturer l'image d'un n�ud ?
- Qu'est-ce qu'un canevas ?
- Comment dessiner dans un canevas ?
Vous pouvez utiliser la classe javafx.scene.image.Image pour r�f�rencer un fichier contenant une image.
Il est possible de r�cup�rer les images � afficher de trois mani�res :
- l'image peut �tre empaquet�e dans une biblioth�que ou une application et r�cup�r�e via le m�canisme des ressources ou des ClassLoader ;
Code Java : S�lectionner tout 1
2final URL imageURL = getClass().getResource("image.png"); final Image image = new Image(imageURL.toExternalForm());
- l'image peut �tre sur un disque local et peut �tre r�f�renc�e par les classes File, Path, URI ou URL ;
Code Java : S�lectionner tout 1
2final String imageURI = new File("C://image.png").toURI().toString(); final Image image = new Image(imageURI);
- l'image peut �tre h�berg�e sur un site web distant et on peut y acc�der par une String ou une URL contenant son chemin d�acc�s.
Code Java : S�lectionner tout 1
2final String imageURI = "http://www.developpez.com/template/images/logo.png"; final Image image = new Image(imageURI);
Il est �galement possible d'utiliser les services d�h�te de l'application pour r�soudre l'URI distante d'une image h�berg�e sur le m�me site que l'application :Code Java : S�lectionner tout 1
2
3final HostServices services = application.getHostServices(); final String imageURI = services.resolveURI(services.getDocumentBase(), "image.jpg"); final Image image = new Image(imageURI);
�tant donn� que la classe Image fonctionne de mani�re asynchrone, le code s'ex�cutera jusqu'au bout m�me si l'image n'est pas trouv�e. Mais rien ne sera affich� dans la vue, bien s�r.
La liste des formats support�s par la classe Image de JavaFX ne semble �tre donn�e nulle part. Toutefois, la liste des formats support�s par ImageIO qui fait lui aussi partie du JDK est donn�e dans la page de documentation du package javax.imageio.
Vous devez utiliser le n�ud graphique javafx.scene.image.ImageView dans lequel vous devez mettre un objet de type javafx.scene.image.Image. ImageView est un n�ud graphique comme un autre et peut donc �tre plac� dans une sc�ne et manipul�, transform�, subir des effets ou des animations comme n'importe quel autre n�ud.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class NodeImage extends Application { @Override public void start(Stage primaryStage) { final URL imageURL = getClass().getResource("image.png"); final Image image = new Image(imageURL.toExternalForm()); final ImageView imageView = new ImageView(image); final Pane root = new Pane(); root.getChildren().setAll(imageView); final Scene scene = new Scene(root, 350, 300); primaryStage.setTitle("Test d'affichage d'image"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } |
Ce qui nous donne :

Ici, nous chargeons une image qui se trouve dans le m�me package que notre classe et nous l'affichons dans la sc�ne.
ImageView a une couleur de fond transparente donc toute image qui a des zones transparentes ou translucides laissera apparaitre la couleur de fond de la sc�ne ou tout n�ud graphique qui aura �t� plac� sous elle.
Il est possible de partager une m�me instance d'Image entre plusieurs instances d'ImageView pour limiter l'usage m�moire.
Il est possible de modifier la taille d'affichage d'une Image, en modifiant les propri�t�s fitWidth ou fithHeight du n�ud ImageView charg� de son affichage.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class Main extends Application { @Override public void start(Stage primaryStage) { final URL imageURL = getClass().getResource("image.png"); final Image image = new Image(imageURL.toExternalForm()); final ImageView imageView = new ImageView(image); imageView.setFitWidth(300); imageView.setFitHeight(100); final Pane root = new Pane(); root.getChildren().setAll(imageView); final Scene scene = new Scene(root, 350, 300); primaryStage.setTitle("Test d'affichage d'image"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } |
Ce qui nous donne :

Utiliser une valeur de 0 pour une de ces propri�t�s �quivaut � utiliser la taille d'origine de l'image pour cette dimension. Les valeurs inf�rieures � 0 seront ignor�es. Les propri�t�s fitWidth ou fitHeight ont une valeur par d�faut de 0.0.
Il est possible de modifier la propri�t� preserveRatio du n�ud ImageView pour que l'image affich�e conserve le ratio d'origine entre les dimensions.
Pour afficher une partie d'une Image (on dit �galement une vue), il faut modifier la propri�t� viewport du n�ud ImageView charg�e de son affichage et y mettre une valeur de type javafx.geometry.Rectangle2D.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class Main extends Application { @Override public void start(Stage primaryStage) { final URL imageURL = getClass().getResource("image.png"); final Image image = new Image(imageURL.toExternalForm()); final ImageView imageView = new ImageView(image); final Rectangle2D viewport = new Rectangle2D(75, 4, 90, 80); imageView.setViewport(viewport); final Pane root = new Pane(); root.getChildren().setAll(imageView); final Scene scene = new Scene(root, 350, 300); primaryStage.setTitle("Test d'affichage d'image"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } |
Ce qui nous donne :

Ici, nous ne voyons qu'une portion de l'image qui se trouve aux coordonn�es d�finies par la vue.
Par d�faut la propri�t� viewport est � la valeur null, ce qui revient � afficher l�int�gralit� de l'image source.
Pour r�cup�rer la valeur d'un pixel dans une image, vous devez acc�der � son lecteur de pixel qui est accessible en invoquant la m�thode getPixelReader() de l'image. Invoquer cette m�thode retourne un objet de type javafx.scene.image.PixelReader. Il est alors possible d'invoquer la m�thode getColor() de cet objet en lui donnant en param�tre les coordonn�es du pixel.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 | final URL imageURL = getClass().getResource("image.png"); final Image image = new Image(imageURL.toExternalForm()); final PixelReader pixelReader = image.getPixelReader(); final Color color = pixelReader.getColor(20, 20); |
Ici, nous r�cup�rons la couleur du pixel aux coordonn�es (20, 20).
Il est �galement possible d'utiliser la m�thode getArgb() qui retournera la couleur sous forme d'un entier codant la couleur au format

Pour modifier la valeur d'un pixel dans une image, il vous faut d�j� avoir une image modifiable ! Ces images sont de type javafx.scene.image.WritableImage. Il vous faut ensuite obtenir une r�f�rence sur son producteur de pixels en invoquant sa m�thode getPixelWriter(). Cette m�thode retourne une instance de type javafx.scene.image.PixelWriter. Il est alors possible d'invoquer la m�thode setColor() sur cet objet en lui donnant en param�tre les coordonn�es et la future couleur du pixel.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 | final WritableImage image = new WritableImage(350, 300); final PixelWriter pixelWriter = image.getPixelWriter(); pixelWriter.setColor(20, 20, Color.RED); |
Ici, l'image initialement cr��e est vierge (transparente) et nous modifions la couleur du pixel aux coordonn�es (20, 20) pour qu'il devienne rouge.
Il est �galement possible d'invoquer la m�thode setArgb() et de passer en param�tre un entier codant la couleur au format

Il est possible de capturer l'image d'un n�ud (� convertir un n�ud vectoriel en image bitmap �) en invoquant sa m�thode snapshot(). Cette m�thode retourne un objet de type WritableImage contenant l'image du noeud.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 | final Rectangle rectangle = new Rectangle(0, 0, 150, 100); rectangle.setFill(Color.RED); final WritableImage rectangleImage = rectangle.snapshot(null, null); |
Le premier param�tre de la m�thode est un objet de type javafx.scene.SnapshotParameters. Il s'agit d'un ensemble de param�tres destin�s � configurer la capture. Cette valeur peut �tre null ce qui implique l'utilisation de param�tres par d�faut.
Le second param�tre de la m�thode est une image pr�allou�e dans laquelle stocker la capture. Elle peut �galement �tre null et dans ce cas une nouvelle image aux dimensions appropri�es sera cr��e.
Il existe une seconde variante de cette m�thode qui ne retourne pas d'image mais prend un troisi�me param�tre : un callback de type Callback<SnapshotResult, Void> (un objet de type javafx.scene.SnapshotResult est pass� en param�tre ; la valeur de retour est de type java.lang.Void) qui sera invoqu� quand la capture est g�n�r�e. Cette m�thode permet de r�agir � la capture en effectuant une action (sauvegarde sur le disque, export dans le presse-papier, etc.) :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 | rectangle.snapshot(snapshotResult -> { final WritableImage result = snapshotResult.getImage(); // Faire quelque chose avec l'image re�ue ici. // La seule valeur possible avec le type java.lang.Void est null. return null; }, null, null); |
Il n'est pas n�cessaire d'inclure les n�uds dans une fen�tre ; cependant, pour que les feuilles de style et la mise en page des n�uds complexes s'effectuent de mani�re correcte, il faut attacher le n�ud � une sc�ne (sans besoin d'attacher cette sc�ne � une fen�tre) au pr�alable.
Il faudra prendre �galement soin de d�sactiver toute animation sur un n�ud le temps de la capture.
Un canevas est un n�ud graphique de type javafx.scene.canvas.Canvas, il s'agit d'une surface bitmap dans laquelle il est possible de dessiner. Alors que la majorit� de l'API SceneGraph utilise des n�uds vectoriels, un canevas permet de faire du dessin point � point. Un canevas est un n�ud graphique comme les autres, il est possible de le d�placer, de le manipuler, de lui faire subir des effets ou des transformations comme n'importe quel autre n�ud SceneGraph.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Main extends Application { @Override public void start(Stage primaryStage) { final Canvas canvas = new Canvas(); canvas.setWidth(350); canvas.setHeight(300); final Pane root = new Pane(); root.getChildren().setAll(canvas); final Scene scene = new Scene(root, 350, 300); primaryStage.setTitle("Test de canevas"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } |
Ici, nous cr�ons un nouveau canevas vierge et transparent qui occupe toute la surface initiale de notre sc�ne.
Pour dessiner dans un canevas, il faut r�cup�rer une r�f�rence vers son contexte graphique en invoquant la m�thode getGraphicsContext2D() du canevas. Cette m�thode retourne un objet de type javafx.scene.canvas.GraphicsContext. Il est ensuite possible d'invoquer des m�thodes de dessins sur le contexte graphique.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class Main extends Application { @Override public void start(Stage primaryStage) { final Canvas canvas = new Canvas(); canvas.setWidth(350); canvas.setHeight(300); final GraphicsContext gc = canvas.getGraphicsContext2D(); // Dessin d'une ligne noire. gc.setStroke(Color.BLACK); gc.setLineWidth(2); gc.strokeLine(50, 50, 300, 250); // Dessin d'un cercle rouge. gc.setStroke(null); gc.setFill(Color.RED); gc.fillOval(100, 100, 100, 100); // final Pane root = new Pane(); root.getChildren().setAll(canvas); final Scene scene = new Scene(root, 350, 300); primaryStage.setTitle("Test de canevas"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } |
Ce qui nous donne :

Ici, les formes dessin�es sont des � pixels morts �, il ne s'agit pas de n�uds SceneGraph comme nous avons pu en cr�er pr�c�demment ; il n'est donc pas possible d'y ajouter des �couteurs, des effets, etc.
Tout comme les images modifiables, le contexte graphique dispose d'un producteur de pixel. Il est possible d�obtenir une r�f�rence vers cet objet en invoquant la m�thode getPixelWriter() du contexte graphique.
Proposer une nouvelle r�ponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �aLes sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.