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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Démarrer avec JavaFX


Sujet :

JavaFX

  1. #1
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut Démarrer avec JavaFX
    Bonjour

    J'ai commencé un projet avec Java Swing, mais certaines fonctionnalités de mon projet ne semblent pas être possible avec Swing
    De plus il semble que Swing n'est plus maintenu depuis plusieurs années, et comme mon projet est de faire évoluer un projet existant écrit en C uniquement sur Windows, vers une mise à jour avec des outils modernes et qu'il soit disponible sur plusieurs plateformes, je me tourne donc vers JavaFX
    Mom premier essai n'est pas fructueux
    Je développe avec Eclipse sous MacOS
    J'ai installé le SDK et JavaFX tous deux en versions 25
    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package fr.free.cdmrail;
     
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
     
    public class CdmRail extends Application {
     
    	@Override
    	public void start(Stage stagePrincipal) {
    		Label message = new Label("Bienvenue dans GestionFacile");
    		StackPane racine = new StackPane(message);
    		Scene scene = new Scene(racine, 480, 320);
     
    		stagePrincipal.setTitle("GestionFacile - Atelier Kodo");
    		stagePrincipal.setScene(scene);
    		stagePrincipal.show();
    	}
     
    	public static void main(String[] args) {
    		Application.launch(args);
    	}
    }
    Le fichier module-info.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    module CDMRAIL {
    	requires javafx.controls;
    	requires javafx.fxml;
    	requires javafx.graphics;
    	requires javafx.media;
    	requires javafx.swing;
    	requires javafx.web;
    	requires java.desktop;
     
    	opens fr.free.cdmrail to javafx.graphics, javafx.base;
    }
    Quand j'exécute le code rien ne s'affiche, pourtant quand je regarde les tâches en exécution elle est bien présente
    QU'est-ce que je fais mal ?

    Merci pour l'aide
    Louis

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 935
    Billets dans le blog
    54
    Par défaut
    J'ai peur que la réponse ici soit : Eclipse.

    Non, je déconne. Pour moi, ce code fonctionne bien sans soucis dans IDEA 2026 (Java27 et JavaFX 27) et NetBeans 25 (Java 25 et JavaFX 25) et Eclipse 2026-09 (JDK 25 et JavaFX 25)... a condition de rajouter la ligne exports qui manque dans le fichier module-info.java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    module CDMRAIL {
        requires javafx.graphics;
        requires javafx.controls;
     
        exports fr.free.cdmrail;
    }
    Sans cette ligne, les logs de demarrage auraient du afficher qq chose de similaire a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Exception in Application constructor
    Exception in thread "main" java.lang.reflect.InvocationTargetException
    	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
    	at java.base/java.lang.reflect.Method.invoke(Method.java:565)
    	at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1171)
    Caused by: java.lang.RuntimeException: Unable to construct Application instance: class test.start.CdmRail
    	at javafx.graphics@25/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:889)
    	at javafx.graphics@25/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$0(LauncherImpl.java:202)
    	at java.base/java.lang.Thread.run(Thread.java:1474)
    Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class fr.free.cdmrail.CdmRail (in module test) because module CDMRAIL does not export fr.free.cdmrail to module javafx.graphics
    	at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:400)
    	at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:670)
    	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:492)
    	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
    	at javafx.graphics@25/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$3(LauncherImpl.java:801)
    	at javafx.graphics@25/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$0(PlatformImpl.java:449)
    	at javafx.graphics@25/com.sun.javafx.application.PlatformImpl.lambda$runLater$0(PlatformImpl.java:424)
    	at javafx.graphics@25/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    	at javafx.graphics@25/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    	at javafx.graphics@25/com.sun.glass.ui.win.WinApplication.lambda$runLoop$0(WinApplication.java:168)

    Pour les instructions généralement utilisables dans module-info.java :
    • requires - liste les modules dont l'application a besoin ce qui permet plus tard aussi de créer le graphe de dépendances et ainsi de produire un environnement plus léger quand on céer un paquet / installeur d'application. Certaines dépendances sont implicites et n'ont pas besoin d’être décrites (ex : javafx.base). Il existe aussi un nommage automatique des anciens JARs non-modulaire en fonction du nom du fichier (automodule) mais... ca marche pas toujours super bien.
    • exports - indique des packages qui sont ouvert au monde extérieur quand on utilise un système modulaire. C'est nécessaire, par exemple, quand on a une classe de lancement (avec un main()) ou des classes qui doivent être accessibles par d'autres modules (ex: quand on crée une lib). Attention, du coup ca rend visible toutes les classes publiques de ce package (donc penser a mettre les bons accesseurs dessus ou a les déplacer dans des sous-packages qui eux ne seront pas exportés).
    • opens - ouvre des packages a des modules spécifiques, entre autre pour pouvoir faire de l'injection ou de la reflection. Ici, je vois pas trop le besoin de faire un opens pour javafx.graphics et javafx.base, ca sert strictement a rien (pour cet exemple). Par contre plus tard tu pourrais être amené a faire un opens pour javafx.fxml par exemple, car le chargement de fichiers FXML demande effectivement a faire de la reflection et de l'injection sur la classe contrôleur.


    A noter que le besoin de créer une application modulaire (ou de déclarer les libs FX sur le MODULEPATH) pour faire du JavaFX a enfin été corrigée dans le JDK 27. C’était un soucis au niveau du code source du JDK qui avait conservé du code spécifique a JavaFX datant d'avant la separation. Désormais le JDK considere que JavaFX est une lib comme une autre qui peut aussi être utilisée sur le CLASSPATH pour une app no-modulaire.

    Alors, juste pour conserver une trace, voici ce que j'ai fait pour arriver a avoir un truc qui fonctionne dans Eclipse :
    • DL la dernière version de l'installeur d'Eclipse (pour Windows).
    • Installation de Eclipse, choix :
      • Eclipse IDE for Java Developer
      • JDK 25 (la version de l'OpenJDK qui était déjà préinstallée sur mon DD)
    • Lancement et configuration de Eclipse 2026-09
    • New -> Java Project
    • Creer le package qu'il faut pour les projet, placer les fichiers java idoines.
    • Propriétés du projet :
      • Verifier que le projet utilise bien le JDK 25
      • Java Build Path -> Libraries -> Modulepath -> Add Library... -> User Library -> Next > -> User Libraries....
      • -> New.., creer une lib nommée Javafx-25
      • -> Add External JARs.... sélectionner tous les fichiers JAR de JavaFX (qui sont situes dans le repertoire lib du SDK JavaFX)
      • Apply and Close
      • Finish
      • Apply and Close


    Rappel : JavaFX utilise des libs natives propres a l'OS sous-jacent (macOS dans ton cas, Windows pour moi), il n'est pas possible de simplement copier le JAR de l'application pour la transporter d'un systeme a un autre.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut
    Hello

    D'abord merci pour cette réponse exhaustive
    Avant de me plonger en détail sur les différents points, la dernière remarque m'interpelle
    J'ai choisi Java pour justement avoir une application qui fonctionne sur les trois architectures, ors tu dis que l'on ne peut pas transporter le jar tel quel !
    Tu peux développer ?
    D'avance merci

    Louis

  4. #4
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut
    Je viens de tester avec l'ajout de l'export mais toujours pas d'affichage

    Les bibliothèques sont bien présentes

    Nom : JavaFX-1.png
Affichages : 60
Taille : 159,8 Ko

    Louis

  5. #5
    doc
    doc est déconnecté
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 115
    Par défaut
    Est ce que les librairies sont bien présentes dans le modulepath et non dans le classpath?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut
    Hello

    Oui comme tu peux le constater

    Nom : JavaFX-2.png
Affichages : 57
Taille : 164,0 Ko

    Merci pour l'aide

    Louis

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 935
    Billets dans le blog
    54
    Par défaut
    "Write Once, Run Anywhere" ca veut pas dire non plus qu'on doit d'affranchir 100% du temps de ce qui est natif et propre au système. Ca veut dire que le code Java (ou son bytecode) lui n'a généralement pas besoin d’être changé ou meme recompilé. Et comme tu l'as vu avec tes souci de version de format de fichier class, ben parfois il faut recompiler quand meme... ou s'assurer qu'on a la meme version partout.

    L'un des soucis extreme des interpretations de cette philosophie est que justement pendant longtemps certains (Sun et Oracle en premier) ont un peu nivelé tout Java par le bas en se reposant uniquement sur des implementations hyper-génériques et ce qui était commun a tous les OS. Ce qui a donné quelques limitations et soucis par exemple dans AWT, Swing incapables de supporter la dernière innovation graphique d'Apple ou de Microsoft, ou encore la gestion des permissions sur les fichiers et les repertoires entres autres. Ca donne souvent l'impression qu'une app Java (pas forcement graphique) est un peu un extra-terrestre tant elle s’intègre et communique mal avec l'écosystème sur lequel elle tourne.

    Ces 15-20 dernières années de gros efforts ont été faits pour corriger le tir, tant au niveau des rouages internes du JDK (le système de fenêtrage, les LnF natifs qui vont récupérer les icones et les couleur système, l'accélération 3D, l’implémentation des preferences propre a chaque OS, etc.) que parfois au niveau de l'API publique (ex: justement la gestion des droits des fichiers qui, dans sa version avancée, supporte bien mieux la gestion des permissions sous Windows, le presse papier, la gestion du desktop). Or tout cela est directement intégré au JDK qui fait énormément de choses natives sous le capot et donc invisibles a l'utilisateur : tu changes d'OS, les nouvelles libs natives dont tu as besoin sont directement incluses dans ton nouveau JDK sur ton nouvel OS. Tu as juste besoin de vérifier que ton app a pas de comportement inattendus (et il peut parfois y en avoir a cause de micro différence de comportement du JDK d'un OS a l'autre ou d'un vendeur a l'autre).

    A partir du moment ou Oracle a décidé de mettre JavaFX a part, ca casse cette dynamique puisque toutes les libs natives dont JavaFX a besoin (pour le système d'affichage -glass-, l'accélération 3D -metal sur macOS, Direct3D sous Windows, OpenGL sous Linux, etc.), le support des média -délégué a GStreamer sous Linux par exemple-, le moteur de rendu web -c'est Webkit et non pas Chromium-) ne sont plus fournies dans le JDK mais doivent être fournies avec chaque version du SDK de JavaFX.

    La présence de libs natives tant dans le JDK que dans le SDK sont une des raisons qui fait par exemple que lorsqu'on utilise l'outil d'Oracle jpackage pour produire une app native... ben on peut uniquement produire une app (meme une app java basique sans FX) pour la plateforme courante (utiliser jpackage sous Windows peut uniquement produire une app Windows, utiliser jpackage sous macOS peut uniquement produire une app macOS, etc. ). L'autre raison est bien sur le fait que pour certaines étapes du process, jpackage se contente de déléguer l'opération a un outils natif fourni dans l'OS. Sinon ca aurait été super méga cool de pouvoir produire toutes les versions depuis une plateforme unique. Mais ce n'est pas le cas, hélas.

    Voici un aperçu de mon app de test dans Eclipse. Le nom du package est légèrement différent dans mon cas mais ca ne devrait pas entraîner un tel comportement différent. Et en plus en théorie en cas d'erreur il devrait y avoir un message dans les logs de lancement.

    Nom : dvpfx1.jpg
Affichages : 54
Taille : 229,0 Ko
    Nom : dvpfx2.png
Affichages : 51
Taille : 39,5 Ko
    Nom : dvpfx3.png
Affichages : 51
Taille : 42,3 Ko
    Nom : dvpfx4.jpg
Affichages : 51
Taille : 142,6 Ko
    Nom : dvpfx5.png
Affichages : 51
Taille : 42,4 Ko
    Nom : dvpfx6.png
Affichages : 52
Taille : 49,6 Ko

    Je vais voir si je peux tester ca sur macOS (x86) dans la journée.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 935
    Billets dans le blog
    54
    Par défaut
    Et le soucis vient de... Eclipse .............

    Sur macOS, tu dois décocher cette option dans les réglages de ta configuration d’exécution pour que l'application puisse afficher correctement sa fenêtre. Cette option n'existe pas dans la version Windows d'Eclipse.

    Nom : dvpfx7.jpg
Affichages : 54
Taille : 178,4 Ko
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut
    Hello

    D'abord merci pour ta réponse, qui une fois de plus est pleine d'enseignement
    En décochant l'option indiquée, la fenêtre s'affiche bien, il faut bien connaître Eclipse en profondeur pour trouver cela, encore merci

    Nom : JavaFX-3 2.png
Affichages : 54
Taille : 26,0 Ko

    Louis

  10. #10
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut
    Hello

    Donc si j'ai bien compris il n'y a pas moyen de générer l'application pour les trois architectures à partir d'une seule plateforme ?
    Si je veux avoir mon application Windows il faut que le développement se fasse sur Windows
    De même pour MacOS et Linux
    N'y a t-il pas moyen à partir d'une platefrome de générer les trois versions en installant les Java SDK et JavaFX des trois plateformes sur une seule plateforme ?
    Un tel outil doit bien exister ?
    Merci pour l'aide
    Louis

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 935
    Billets dans le blog
    54
    Par défaut
    Vu que tout se fait via la ligne de commande, en principe oui c'est possible soit via des VMs, des conteneurs (Docker) ou en déportant la tache vers un exécuteur (autre machine) tournant sous le bon OS (voir Jenkins ou d'autres outils de build).

    Tout ce que tu dois faire sur le mac c'est : créer le ou les fichiers JAR de l'app sur ton mac et copier ce(s) JAR sur les plateformes cibles.

    Au niveau des plateformes cibles, elles doivent avoir :
    • Le JDK natif
    • le SDK FX natif
    • Les fichiers JMODs de JavaFX natifs
    • Une icône d'app native pour cette plateforme :
      • macOS : ICNS
      • Windows : ICO
      • Linux (optionnel) : PNG
    • Les éventuelles dépendances JAR des libs tierces utilisées par l'app (si tu as choisi de ne pas les inclure dans le JAR de ton app).


    Voici un des scripts que j'utilise pour packager une app (ici mon JAR est genere par IDEA, et ce JAR inclut toutes les dépendances connexes hors FX). Il existe d'autres flags dans la doc de jpackage pour des configurations avancées et des choses spécifiques a certaines plateformes ou pour changer le format de sortie. Idem regarder les options disponibles pour le flag --type ; la valeur app-image permet de creer un dossier contenant l'application portable (pour cet OS) et prête a l'emploi avec une JVM dédiée qui a été dégrossie de tous ses composants superflus via la gestion des modules.

    macOS (bash)
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    #!/bin/bash
    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-25.jdk/Contents/Home/
    export PATH=$PATH:$JAVA_HOME/bin
     
    export APP_NAME=XXX
    # macOS only support version scheme from 1 up to 3 digits. 4 digits not supported.
    export APP_VERSION=3.0.0
    export APP_COPYRIGHT="YYY"
    export APP_VENDOR="ZZZ"
    export APP_ICON=./package/macosx/XXX.icns
    export APP_DESCRIPTION="Blablablabla"
    export APP_MODULES=java.logging,javafx.fxml,javafx.controls,javafx.swing
    export MAIN_JAR=XXX.jar
    export JAVA_OPTIONS=--enable-native-access=javafx.graphics
     
    export INPUT_DIR=./out/artifacts/XXX_jar
    export OUTPUT_DIR=redist
     
    export FX_HOME=/Users/fabriceb/devel/lib/javafx/javafx-sdk-25
    export FX_LIBS=$FX_HOME/lib
    export FX_JMODS=$FX_HOME/jmods
     
    if [[ -d $OUTPUT_DIR/$APP_NAME ]]; then
    	rm -rf "{$OUTPUT_DIR/$APP_NAME:?}"*
    fi
    mkdir -p $OUTPUT_DIR
    jpackage --type dmg --input $INPUT_DIR --name $APP_NAME --main-jar $MAIN_JAR \
    --module-path $FX_JMODS --add-modules $APP_MODULES --dest $OUTPUT_DIR \
    --java-options $JAVA_OPTIONS \
    --icon $APP_ICON --app-version $APP_VERSION --copyright "$APP_COPYRIGHT" \
    --description "$APP_DESCRIPTION" --vendor "$APP_VENDOR"

    Linux (bash)
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #!/bin/bash
    export PATH=$PATH:$JAVA_HOME/bin
     
    export APP_NAME=XXX
    export APP_VERSION=3.0.0.0
    export APP_COPYRIGHT="YYY"
    export APP_VENDOR="ZZZ"
    export APP_ICON=.\package\windows\XXX.png
    export APP_DESCRIPTION="Blablablabla"
    export APP_MODULES=java.logging,javafx.fxml,javafx.controls,javafx.swing
    export MAIN_JAR=XXX.jar
    export JAVA_OPTIONS=--enable-native-access=javafx.graphics
     
    export INPUT_DIR=./out/artifacts/XXX_jar
    export OUTPUT_DIR=redist
     
    export FX_HOME=~/devel/javafx/javafx-sdk-25
    export FX_LIBS=$FX_HOME/lib
    export FX_JMODS=$FX_HOME/jmods
     
    if [[ -d $OUTPUT_DIR/$APP_NAME ]]; then
    	rm -rf "{$OUTPUT_DIR/$APP_NAME:?}"*
    fi
    mkdir -p $OUTPUT_DIR
    jpackage --type app-image --input $INPUT_DIR --name $APP_NAME --main-jar $MAIN_JAR \
    --module-path $FX_JMODS --add-modules $APP_MODULES --dest $OUTPUT_DIR \
    --java-options $JAVA_OPTIONS \
    --icon $APP_ICON --app-version $APP_VERSION --copyright "$APP_COPYRIGHT" \
    --description "$APP_DESCRIPTION" --vendor "$APP_VENDOR"

    Windows (CMD)
    Code cmd : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    @echo off
    set JAVA_HOME="C:\Program Files\java\jdk-25\"
    set PATH=%JAVA_HOME%\bin;%PATH%
     
    java -version
     
    set APP_NAME=XXX
    set APP_VERSION=3.0.0.0
    set APP_COPYRIGHT="YYY"
    set APP_VENDOR="ZZZ"
    set APP_ICON=.\package\windows\XXX.ico
    set APP_DESCRIPTION="Blablablabla"
    set APP_MODULES=java.logging,javafx.fxml,javafx.controls,javafx.swing
    set MAIN_JAR=XXX.jar
    set JAVA_OPTIONS=--enable-native-access=javafx.graphics
     
    set INPUT_DIR=out\artifacts\XXX_jar
    set OUTPUT_DIR=redist
     
    set FX_HOME=E:\fabriceb\Devel\Java\lib\JavaFX\javafx-sdk-25
    set FX_LIBS=%FX_HOME%\lib
    set FX_JMODS=%FX_HOME%\jmods
     
    if exist %OUTPUT_DIR%\%APP_NAME% rmdir /s /q %OUTPUT_DIR%\%APP_NAME%
    if not exist %OUTPUT_DIR% mkdir %OUTPUT_DIR%
    jpackage.exe --type app-image --input %INPUT_DIR% --name %APP_NAME% ^
    --main-jar %MAIN_JAR% --module-path %FX_JMODS% --add-modules %APP_MODULES% ^
    --dest %OUTPUT_DIR% ^
    --java-options %JAVA_OPTIONS% ^
    --icon %APP_ICON% --app-version %APP_VERSION% --copyright ^
    %APP_COPYRIGHT% --description %APP_DESCRIPTION% --vendor %APP_VENDOR%

    Typiquement pour Windows, si on ne passe pas par un fichier MSI, on empaquettera l'application dans un installeur qui aura ete genere par un outils tiers.

    Les choses qu'il manque ici (et qui demandent a sortir sa carte de credit pour acheter des certificats numériques) :
    • Etape pre generation de l'app : La signature numérique du(des) fichier(s) JAR avec un certificat capable de signer du code Java.
    • Etape post generation de l'app :La signature du lanceur ou de l'image avec un certificat capable de signer un executable pour la plateforme (ex : certificat développeur Apple pour macOS, certificat compatible Authenticode pour Windows, pas besoin pour Linux)
    • Etape post generation de l'installeur :Si on génère un installeur avec un outil tier, a nouveau un certificat capable de signer cet installeur pour la plateforme ciblée.


    Note : la signature numérique est obligatoire pour la distribution via les stores officiels, et apporte un certain confort pour l'utilisateur lors de la redistribution /le téléchargement direct.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 935
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par sonata32 Voir le message
    il faut bien connaître Eclipse en profondeur pour trouver cela, encore merci
    Confronté au meme soucis sur macOS, j'ai surtout eut la chance de très vite tomber sur cette suggestion sur Stackoverflow. J'utilise principalement IDEA et un peu NetBeans. Je ne supporte pas Eclipse.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut
    Hello

    Encore merci pour ta réponse détaillée, il va falloir que je me plonge la dessus pour tout comprendre
    Sinon que reproches tu à Eclipse par rapport à IntelliJ IDEA ?
    Merci pour l'aide

    Louis

  14. #14
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut
    Continuant ma découverte de JavaFX, je vois déjà un comportement différent entre MacOS et Windows

    Sur MacOs
    Nom : JavaFX-4.png
Affichages : 49
Taille : 24,8 Ko
    La VBox est collé à gauche sans marge

    Sur Windows
    Nom : JavaFX-5.png
Affichages : 47
Taille : 50,5 Ko
    La VBox est collé à gauche avec une marge

    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    package com.jdojo.intro;
     
    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
     
    public class HelloFXApp extends Application {
    	public static void main(String[] args) {
    		// Launch the JavaFX application
    		Application.launch(args);
    	}
     
    	@Override
    	public void start(Stage stage) {
    		Label nameLbl = new Label("Enter your name:");
    		TextField nameFld = new TextField();
     
    		Label msg = new Label();
    		msg.setStyle("-fx-text-fill: blue;");
     
    		// Create buttons 
    		Button sayHelloBtn = new Button("Say Hello");
    		Button exitBtn = new Button("Exit");
     
    		// Add the event handler for the Say Hello button
    		sayHelloBtn.setOnAction(e -> {
    			String name = nameFld.getText();
    			if (name.trim().length() > 0) {
    				msg.setText("Hello " + name);
    			} else {
    				msg.setText("Hello there");
    			}
    		});
     
    		// Add the event handler for the Exit button
    		exitBtn.setOnAction(e -> Platform.exit());
     
    		// Create the root node
    		VBox root = new VBox();
     
    		// Set the vertical spacing between children to 5px
    		root.setSpacing(5);
     
    		// Add children to the root node
    		root.getChildren().addAll(nameLbl, nameFld, msg, sayHelloBtn, exitBtn);
     
    		Scene scene = new Scene(root, 350, 150);
    		stage.setScene(scene);
    		stage.setTitle("Improved Hello JavaFX Application");
    		stage.show();
    	}
    }
    Merci pour l'aide
    Louis

  15. #15
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut
    Hello

    Toujours à la découverte de JavaFX à travers des exemples

    Pourquoi j'ai une erreur en ligne 36 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    package com.atelierkodo.gestionfacile;
     
    import java.awt.Button;
     
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.Priority;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
     
    public class MainApp extends Application {
     
    	@Override
    	public void start(@SuppressWarnings("exports") Stage stagePrincipal) {
    		Label message = new Label("Bienvenue dans GestionFacile");
    		StackPane racine = new StackPane(message);
    		Scene scene = new Scene(racine, 480, 320);
     
    		stagePrincipal.setTitle("GestionFacile - Atelier Kodo");
    		stagePrincipal.setMinWidth(800);      
    		stagePrincipal.setMinHeight(600);     
    		stagePrincipal.setResizable(true);      
    		stagePrincipal.setScene(scene);
     
    		VBox conteneurPrincipal = new VBox(10);  
     
    		Label titre = new Label("Commandes en cours");  
    		titre.setStyle("-fx-font-weight: bold; -fx-font-size: 16px;");  
     
    		HBox ligneActions = new HBox(8);  
    		Button boutonNouveau = new Button("Nouvelle commande");  
    		Button boutonSupprimer = new Button("Supprimer");
    		ligneActions.getChildren().addAll(boutonNouveau, boutonSupprimer);    
     
    		conteneurPrincipal.getChildren().addAll(titre, ligneActions);
     
     
    		stagePrincipal.show();
    	}
     
    	public static void main(String[] args) {
    		Application.launch(args);
    	}
    }
    J'ai le message
    The method addAll(int, Collection<? extends Node>) in the type List<Node> is not applicable for the arguments (Button, Button)
    Merci pour votre aide

    Louis

  16. #16
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut
    Et pourtant cet exemple ci-dessous fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    // ImprovedHelloFXApp.java
    package com.jdojo.intro;
     
    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
     
    public class HelloFXApp extends Application {
    	public static void main(String[] args) {
    		Application.launch(args);
    	}
     
    	@Override
    	public void start(Stage stage) {
    		Label nameLbl = new Label("Enter your name:");
    		TextField nameFld = new TextField();
     
    		Label msg = new Label();
    		msg.setStyle("-fx-text-fill: blue;");
     
    		// Create buttons 
    		Button sayHelloBtn = new Button("Say Hello");
    		Button exitBtn = new Button("Exit");
     
    		// Add the event handler for the Say Hello button
    		sayHelloBtn.setOnAction(e -> {
    			String name = nameFld.getText();
    			if (name.trim().length() > 0) {
    				msg.setText("Hello " + name);
    			} else {
    				msg.setText("Hello there");
    			}
    		});
     
    		// Add the event handler for the Exit button
    		exitBtn.setOnAction(e -> Platform.exit());
     
    		// Create the root node
    		VBox root = new VBox();
     
    		// Set the vertical spacing between children to 5px
    		root.setSpacing(5);
     
    		// Add children to the root node
    		root.getChildren().addAll(nameLbl, nameFld, msg, sayHelloBtn, exitBtn);
     
    		Scene scene = new Scene(root, 350, 150);
    		stage.setScene(scene);
    		stage.setTitle("Improved Hello JavaFX Application");
    		stage.show();
    	}
    }
    J'avoue ne pas comprendre

    Merci pour votre aide
    Louis

  17. #17
    doc
    doc est déconnecté
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 115
    Par défaut
    Citation Envoyé par sonata32 Voir le message
    Hello

    Toujours à la découverte de JavaFX à travers des exemples

    Pourquoi j'ai une erreur en ligne 36 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    package com.atelierkodo.gestionfacile;
     
    import java.awt.Button;
     
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.Priority;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
     
    public class MainApp extends Application {
     
        @Override
        public void start(@SuppressWarnings("exports") Stage stagePrincipal) {
            Label message = new Label("Bienvenue dans GestionFacile");
            StackPane racine = new StackPane(message);
            Scene scene = new Scene(racine, 480, 320);
     
            stagePrincipal.setTitle("GestionFacile - Atelier Kodo");
            stagePrincipal.setMinWidth(800);      
            stagePrincipal.setMinHeight(600);     
            stagePrincipal.setResizable(true);      
            stagePrincipal.setScene(scene);
     
            VBox conteneurPrincipal = new VBox(10);  
     
            Label titre = new Label("Commandes en cours");  
            titre.setStyle("-fx-font-weight: bold; -fx-font-size: 16px;");  
     
            HBox ligneActions = new HBox(8);  
            Button boutonNouveau = new Button("Nouvelle commande");  
            Button boutonSupprimer = new Button("Supprimer");
            ligneActions.getChildren().addAll(boutonNouveau, boutonSupprimer);    
     
            conteneurPrincipal.getChildren().addAll(titre, ligneActions);
     
     
            stagePrincipal.show();
        }
     
        public static void main(String[] args) {
            Application.launch(args);
        }
    }
    J'ai le message

    Merci pour votre aide

    Louis
    java.awt.Button n'est pas un node pour javafx
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut
    Hello

    Alors là j'avais pas vu
    Quand j'ai eu l'erreur il me proposait d'importer une bibliothèque et j'ai cliqué sur la première sans voir que c'était awt
    Merci

    Louis

  19. #19
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 935
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par sonata32 Voir le message

    Sur MacOs
    La VBox est collé à gauche sans marge

    Sur Windows
    La VBox est collé à gauche avec une marge
    Une marge ? Ou ca ? Je vois juste que les bordures de fenêtre sont plus larges sur Windows que sur macOs mais ca depend du système de fenêtrage et de la tendance actuelle pour le LnF qu'autre chose... A noter que ce LnF Windows n'est pas le plus recent. C'est Windows 10 ou plus ancien ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  20. #20
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2026
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2026
    Messages : 75
    Par défaut
    Hello
    Merci pour la réponse
    C'est un exemple que j'ai trouvé, il n'est pas précisé la version de Windows
    Louis

Discussions similaires

  1. Application Base de données avec JavaFX
    Par typhon_183 dans le forum JavaFX
    Réponses: 5
    Dernier message: 27/08/2012, 13h04
  2. Réponses: 0
    Dernier message: 22/06/2011, 14h53
  3. Manipulation des fichier avec JavaFX
    Par med-angelo dans le forum JavaFX
    Réponses: 4
    Dernier message: 26/10/2010, 22h09
  4. travailler avec javaFX et Swing GUI Forms en meme temps
    Par sahar_sr dans le forum NetBeans
    Réponses: 1
    Dernier message: 15/03/2010, 21h45
  5. Votre avis sur l'héritage multiple avec JavaFX
    Par guitariste dans le forum JavaFX
    Réponses: 12
    Dernier message: 01/09/2009, 23h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo