IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
logo

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.

SommaireSceneGraphImages (10)
pr�c�dent sommaire suivant
 

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
    2
    final 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
    2
    final 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
    2
    final 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
    3
    final 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.

Mis � jour le 8 septembre 2014 bouye

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.

Mis � jour le 8 septembre 2014 bouye

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.

Mis � jour le 8 septembre 2014 bouye

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.

Mis � jour le 8 septembre 2014 bouye

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.

Mis � jour le 8 septembre 2014 bouye

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

Mis � jour le 26 septembre 2014 bouye

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

Mis � jour le 26 septembre 2014 bouye

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.

Mis � jour le 15 mars 2015 bouye

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.

Mis � jour le 25 septembre 2014 bouye

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.

Mis � jour le 25 septembre 2014 bouye

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 �a


R�ponse � la question

Liens sous la question
pr�c�dent sommaire suivant
 

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