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 :

compilation d'une application java FX


Sujet :

JavaFX

  1. #1
    Membre à l'essai
    compilation d'une application java FX
    Bonjour ! et merci d'avance à tout ceux qui peuvent m'aider !

    voilà ca doit faire plusieurs jours que je transpire et que je me bats sur ce sujet : j'ai fait ma petite appli de test sur e(fx)clipse, qui marche parfaitement, et j'essaie de créer un executable .exe pour windows.

    j'utilise la version javafx-sdk-11.0.2
    ma version de jdk est : jdk-14.0.2

    pour compiler mon application je tente de générer mon build.xml en utilisant le fichier build.fxbuild intégré au départ à la création de mon projet javaFX sur e(fx)clipse.
    j'obtiens le message d'erreur suivant lors de l'éxecution de mon fichier build.xml par Ant:

    Buildfile: C:\Users\regol\eclipse-workspace\bonjour\build\build.xml
    setup-staging-area:
    [delete] Deleting directory C:\Users\regol\eclipse-workspace\bonjour\build\externalLibs
    [delete] Deleting directory C:\Users\regol\eclipse-workspace\bonjour\build\project
    [delete] Deleting directory C:\Users\regol\eclipse-workspace\bonjour\build\projectRefs
    [mkdir] Created dir: C:\Users\regol\eclipse-workspace\bonjour\build\externalLibs
    [copy] Copying 1 file to C:\Users\regol\eclipse-workspace\bonjour\build\externalLibs
    [copy] Copying 1 file to C:\Users\regol\eclipse-workspace\bonjour\build\externalLibs
    [copy] Copying 1 file to C:\Users\regol\eclipse-workspace\bonjour\build\externalLibs
    [copy] Copying 1 file to C:\Users\regol\eclipse-workspace\bonjour\build\externalLibs
    [copy] Copying 1 file to C:\Users\regol\eclipse-workspace\bonjour\build\externalLibs
    [copy] Copying 1 file to C:\Users\regol\eclipse-workspace\bonjour\build\externalLibs
    [copy] Copying 1 file to C:\Users\regol\eclipse-workspace\bonjour\build\externalLibs
    [copy] Copying 1 file to C:\Users\regol\eclipse-workspace\bonjour\build\externalLibs
    [mkdir] Created dir: C:\Users\regol\eclipse-workspace\bonjour\build\project
    [copy] Copying 1 file to C:\Users\regol\eclipse-workspace\bonjour\build\project
    [mkdir] Created dir: C:\Users\regol\eclipse-workspace\bonjour\build\projectRefs
    do-compile:
    [delete] Deleting directory C:\Users\regol\eclipse-workspace\bonjour\build\build
    [mkdir] Created dir: C:\Users\regol\eclipse-workspace\bonjour\build\build\src
    [mkdir] Created dir: C:\Users\regol\eclipse-workspace\bonjour\build\build\libs
    [mkdir] Created dir: C:\Users\regol\eclipse-workspace\bonjour\build\build\classes
    [copy] Copying 8 files to C:\Users\regol\eclipse-workspace\bonjour\build\build\libs
    [copy] Copying 1 file to C:\Users\regol\eclipse-workspace\bonjour\build\build\src
    [javac] Compiling 1 source file to C:\Users\regol\eclipse-workspace\bonjour\build\build\classes
    init-fx-tasks:
    [taskdef] Could not load definitions from resource com/sun/javafx/tools/ant/antlib.xml. It could not be found.
    do-deploy:
    [copy] Copying 8 files to C:\Users\regol\eclipse-workspace\bonjour\build\dist\libs

    BUILD FAILED
    C:\Users\regol\eclipse-workspace\bonjour\build\build.xml:132: Problem: failed to create task or type javafx:com.sun.javafx.tools.ant:resources
    Cause: The name is undefined.
    Action: Check the spelling.
    Action: Check that any custom tasks/types have been declared.
    Action: Check that any <presetdef>/<macrodef> declarations have taken place.
    No types or tasks have been defined in this namespace yet
    quelque chose m'intrigue dans mon fichier xml, il y est fait mention de deux fichier .jar que je suis incapable de trouver sur mon PC : ant-javafx.jar, et jfxrt.jar

    pour info mon fichier build.xml :
    Code XML :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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    <?xml version="1.0" encoding="UTF-8"?>
               <project name="bonjour" default="do-deploy" basedir="."  xmlns:fx="javafx:com.sun.javafx.tools.ant">
               <target name="init-fx-tasks">
                         <path id="fxant">
                                    <filelist>
                                              <file name="${java.home}\..\lib\ant-javafx.jar"/>
                                              <file name="${java.home}\lib\jfxrt.jar"/>
                                    </filelist>
                         </path>
     
                         <taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
                                    uri="javafx:com.sun.javafx.tools.ant"
                                    classpathref="fxant"/>
               </target>
               <target name="setup-staging-area">
                         <delete dir="externalLibs" />
                         <delete dir="project" />
                         <delete dir="projectRefs" />
     
                         <mkdir dir="externalLibs" />
     
                         <copy todir="externalLibs">
                                    <fileset dir="C:\Program Files\Java\JFX\javafx-sdk-11.0.2\lib">
                                              <filename name="javafx.graphics.jar"/>
                                    </fileset>
                         </copy>
                         <copy todir="externalLibs">
                                    <fileset dir="C:\Program Files\Java\JFX\javafx-sdk-11.0.2\lib">
                                              <filename name="javafx-swt.jar"/>
                                    </fileset>
                         </copy>
                         <copy todir="externalLibs">
                                    <fileset dir="C:\Program Files\Java\JFX\javafx-sdk-11.0.2\lib">
                                              <filename name="javafx.web.jar"/>
                                    </fileset>
                         </copy>
                         <copy todir="externalLibs">
                                    <fileset dir="C:\Program Files\Java\JFX\javafx-sdk-11.0.2\lib">
                                              <filename name="javafx.fxml.jar"/>
                                    </fileset>
                         </copy>
                         <copy todir="externalLibs">
                                    <fileset dir="C:\Program Files\Java\JFX\javafx-sdk-11.0.2\lib">
                                              <filename name="javafx.base.jar"/>
                                    </fileset>
                         </copy>
                         <copy todir="externalLibs">
                                    <fileset dir="C:\Program Files\Java\JFX\javafx-sdk-11.0.2\lib">
                                              <filename name="javafx.swing.jar"/>
                                    </fileset>
                         </copy>
                         <copy todir="externalLibs">
                                    <fileset dir="C:\Program Files\Java\JFX\javafx-sdk-11.0.2\lib">
                                              <filename name="javafx.media.jar"/>
                                    </fileset>
                         </copy>
                         <copy todir="externalLibs">
                                    <fileset dir="C:\Program Files\Java\JFX\javafx-sdk-11.0.2\lib">
                                              <filename name="javafx.controls.jar"/>
                                    </fileset>
                         </copy>
     
                         <mkdir dir="project" />
                         <copy todir="project">
                                    <fileset dir="C:\Users\regol\eclipse-workspace\bonjour">
                                              <include name="src/**" />
                                    </fileset>
                         </copy>
     
                         <mkdir dir="projectRefs" />
               </target>
               <target name='do-compile'>
                         <delete dir="build" />
                         <mkdir dir="build/src" />
                         <mkdir dir="build/libs" />
                         <mkdir dir="build/classes" />
     
                         <!-- Copy project-libs references -->
                         <copy todir="build/libs">
                                    <fileset dir="externalLibs">
                                              <include name="javafx-swt.jar"/>
                                              <include name="javafx.fxml.jar"/>
                                              <include name="javafx.swing.jar"/>
                                              <include name="javafx.graphics.jar"/>
                                              <include name="javafx.base.jar"/>
                                              <include name="javafx.web.jar"/>
                                              <include name="javafx.media.jar"/>
                                              <include name="javafx.controls.jar"/>
                                    </fileset>
                         </copy>
     
                         <!-- Copy project references -->
     
                         <!-- Copy project sources itself -->
                         <copy todir="build/src">
                                    <fileset dir="project/src">
                                              <include name="**/*"/>
                                    </fileset>
                         </copy>
     
                         <javac includeantruntime="false" source="14" target="14" srcdir="build/src" destdir="build/classes" encoding="Cp1252">
                                    <classpath>
                                              <fileset dir="build/libs">
                                                         <include name="*"/>
                                              </fileset>
                                    </classpath>
                         </javac>
     
                         <!-- Copy over none Java-Files -->
                         <copy todir="build/classes">
                         <fileset dir="project/src">
                                    <exclude name="**/*.java"/>
                         </fileset>
                         </copy>
     
     
               </target>
               <target name="do-deploy" depends="setup-staging-area, do-compile, init-fx-tasks">
                         <delete file="dist"/>
                         <delete file="deploy" />
     
                         <mkdir dir="dist" />
                         <mkdir dir="dist/libs" />
     
                         <copy todir="dist/libs">
                                    <fileset dir="externalLibs">
                                              <include name="*" />
                                    </fileset>
                         </copy>
     
     
                         <fx:resources id="appRes">
                                    <fx:fileset dir="dist" includes="bonjour.jar"/>
                                    <fx:fileset dir="dist" includes="libs/*"/>
                         </fx:resources>
     
                         <fx:application id="fxApplication"
                                    name="Main"
                                    mainClass="application.Main"
                                    toolkit="fx"
                         />
     
                         <mkdir dir="build/classes/META-INF" />
     
     
     
                         <fx:jar destfile="dist/bonjour.jar">
                                    <fx:application refid="fxApplication"/>
                                    <fileset dir="build/classes">
                                    </fileset>
                                    <fx:resources refid="appRes"/>
     
                                    <manifest>
                                              <attribute name="Implementation-Vendor" value="politi"/>
                                              <attribute name="Implementation-Title" value="Main"/>
                                              <attribute name="Implementation-Version" value="1.0"/>
                                              <attribute name="JavaFX-Feature-Proxy" value="None"/>
                                    </manifest>
                         </fx:jar>
     
                         <!-- Need to use ${basedir} because somehow the ant task is calculating the directory differently -->
                         <fx:signjar
                                    keystore="juju"
                                    alias="juju"
                                    keypass="juju"
                                    storepass="juju"
                                    destDir="${basedir}/dist">
                                    <fileset dir='dist'>
                                              <include name='**/*.jar' />
                                    </fileset>
                         </fx:signjar>
     
                         <mkdir dir="deploy" />
                         <!-- Need to use ${basedir} because somehow the ant task is calculating the directory differently -->
                         <fx:deploy
                                    embedJNLP="false"
                                    extension="false"
                                    width="400" height="400"
                                    includeDT="false"
                                    offlineAllowed="true"
                                    outdir="${basedir}/deploy"
                                    outfile="bonjour" nativeBundles="exe"
                                    updatemode="background" >
     
                                    <fx:platform basedir="${java.home}"/>
                                    <fx:info title="bonjour" vendor="politi"/>
     
                                    <fx:application refId="fxApplication"/>
                                    <fx:resources refid="appRes"/>
                                    <fx:permissions elevated="true"/>
                         </fx:deploy>
     
     
               </target>
    </project>



    voilà, maintenant je me demande si il ne serait pas mieux de passer par Maven pour construire mon projet Javafx ? quelle est la meilleur solution ? la plus largement utilisée ? passer par Ant et e(fx)clipse, ou construire un projet maven/javafx ?

    un grand merci !

  2. #2
    Rédacteur/Modérateur

    Ce fichier build.xml semble avoir été fait pour une version antérieure de JavaFX (aux alentours du JDK 8), car comme tu le signales fichier (jfxrt.jar) n'est plus présent dans les distributions modulaires plus récentes.
    Il faudrait peut-être tenter de contacter l'auteur de e(fx)clipse pour savoir s'il peut adapter son plugin pour le faire fonctionner avec jpackage puisque tu bosse désormais avec un JDK plus récent qui supporte cet outil.

    Alternativement, tu peux tenter de t'inspirer de ce topic pour créer une tache ANT qui fait la même chose.
    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
    Membre à l'essai
    Merci Bouye !

    oui c'est bien ce que je soupçonnais : le plugin build.fxbuild à été concu il y a un bout de temps.


    mais il y a tellement de choses hors de ma portée pour l'instant si je veux régler ce problème en javafx, trop galère... Je vais retourner à Swing qui est il me semble bien plus documenté et surtout davantage intégré au JDK, ce sera beaucoup plus facile pour moi et mon niveau de débutant. Je retenterai javafx un peu plus tard quand je serai un peu plus aguerris.

    Hier soir ( cette nuit ! )j'ai donc recommencé un petit bout de mon projet en m'appuyant sur Swing, puis en le compilant en ligne de commande (javac ), pour ensuite créer un jar executable ( jar cvfm etc....). et bon ca marche ! je voulais juste savoir si j'allais y parvenir. Pareil ici pour mon niveau de débutant et de petites applis ca ira très bien pour l'instant.

    Un grand merci pour avoir pris la peine de répondre à ma question, ca fait plaisir

  4. #4
    Membre à l'essai
    Bon alors j'ai un peu progressé sur cette question de produire un executable javafx, sous forme d'un jar exécutable.

    j'ai décidé de passer par Maven sous eclipse, j'ai laissé tomber e(fx)clipse.

    j'ai mis pas mal de temps à comprendre comment Maven fonctionnait, et je suis parvenu à structurer un projet Maven, qui me permet de faire fonctionner un petit helloWorld en passant par Maven.

    dans mon POM.xml j'ai le plugin suivant:

    Code XML :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <plugin>
                    <groupId>org.openjfx</groupId>
                    <artifactId>javafx-maven-plugin</artifactId>
                    <version>0.0.4</version>
                    <configuration>
                        <mainClass>org.open.jfx.hellofx.App</mainClass>
                    </configuration>
                </plugin>


    et j'ai la dépendance suivante :
    Code XML :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <dependencies>
            <dependency>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-controls</artifactId>
                <version>14</version>
            </dependency>
        </dependencies>


    grace à tout ça, je peux utiliser le goal du plugin suivant:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    clean javafx:run


    qui me produit un build sans erreur et fait aparraitre mon helloWorld sous eclipse. Donc tout ça c'est un grand pas en avant pour moi

    Ceci dit....je ne parviens pas à trouver le GOAL qui me permettrait de créer un JAr exécutable de mon projet. il semblerait que mon plugin n'ai que deux Goals utilisable : javafx:run, et javafx:jlink

    mais ça ne me génère rien dans mon dossier 'target'. et surtout ça ne me crée aucun jar executable...

    je vais continuer à chercher mais si vous avez une réponse pour me permettre d'arriver moins péniblement à comprendre, je suis preneur !

    pour info voici le code de mon HelloWorld.java, ainsi que l'intégralité de mon fichier POM.xml

    App.java ( le nom de ma classe de type HelloWorld) :
    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
    package org.open.jfx.hellofx;
     
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
     
     
    /**
     * JavaFX App
     */
    public class App extends Application {
     
        @Override
        public void start(Stage stage) {
            var javaVersion = SystemInfo.javaVersion();
            var javafxVersion = SystemInfo.javafxVersion();
     
            var label = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
            var scene = new Scene(new StackPane(label), 640, 480);
            stage.setScene(scene);
            stage.show();
        }
     
        public static void main(String[] args) {
            launch();
        }
     
    }


    et maintenant mon fichier pom.xml ( effective POM ) :
    Code XML :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
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />si="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.open.jfx</groupId>
        <artifactId>hellofx</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>11</maven.compiler.source>
            <maven.compiler.target>11</maven.compiler.target>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-controls</artifactId>
                <version>14</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <release>11</release>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.openjfx</groupId>
                    <artifactId>javafx-maven-plugin</artifactId>
                    <version>0.0.4</version>
                    <configuration>
                        <mainClass>org.open.jfx.hellofx.App</mainClass>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>


    Merci ! mon seul but pour l'instant, c'est de parvenir à produire un jar exécutable.

  5. #5
    Rédacteur/Modérateur

    J'peux pas trop dire du coté de Maven vu les difficultés que j'ai a l'utiliser ici (sécurité du réseau + faible bande passante).

    Mais après avoir installé Eclipse 2020-06, fait un projet Java basique basique dans Eclipse qui ouvre un stage et imprime "Hello World!" quand on appuie sur un bouton avec le JDK 14.0.1 + JavaFX 14 (ajouté sur le module path*) et ensuite demande de créer un JAR, la solution en ligne de commande qui invoque jpackage détaillée dans la discussion que j'ai linké plus haut fonctionne toujours très bien.

    * Donc aucun besoin de e(fx)clipse ou de Gluon.
    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

  6. #6
    Membre à l'essai
    quel idiot je suis je n'avais pas vu le lien la première fois ! je viens de voir ça et je vais le tester très vite.

    Merci beaucoup Bouye !!

  7. #7
    Membre à l'essai
    Hello c'est encore moi ! à force de plusieurs ( dizaines ) heures de recherches et de tentatives infructueuses, de lecture de tutos que je ne comprenais qu'à moitié, j'ai fini par réussir à faire un jar exécutable avec un programme javaFX assez simple !!! victoire !! mais quelle galère, et c'est pas fini :

    j'ai du passer par l'utilisation de Maven-shade-plugin dans mon fichier POM.xml
    puis en faisant un mvn clean package, je suis parvenu à créer ce fameux executable jar !

    bon alors, maintenant j'ai essayé la même chose avec mon projet de départ, une très simple ToDoListe qui est structuré avec un fichier fxml et un controlleur fxml.

    j'obtiens bien sur une erreur de type "javafx.fxml.LoadException" ! lorsque j'essaie d'executer la commande java -jar monExecutable.jar

    l'erreur produite est la suivante :
    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
    Exception in Application start method
    Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
            at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
            at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
            at java.base/java.lang.Thread.run(Thread.java:832)
    Caused by: javafx.fxml.LoadException:
    file:/C:/Users/regol/Projets_Java/ToDoListV2/target/ToDoListV2-0.0.1-SNAPSHOT.jar!/org/openjfx/ToDoListV2/primary.fxml:12
     
            at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
            at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)
            at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
            at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
            at org.openjfx.ToDoListV2.App.loadFXML(App.java:36)
            at org.openjfx.ToDoListV2.App.start(App.java:23)
            at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
            at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
            at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
            at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
            at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
            at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
            at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
            at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
            ... 1 more
    Caused by: java.lang.NullPointerException
            at Utils.DataLoadSave.intializeObservable(DataLoadSave.java:47)
            at org.openjfx.ToDoListV2.PrimaryController.<init>(PrimaryController.java:18)
            at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
            at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
            at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
            at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:124)
            at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:346)
            at java.base/java.lang.Class.newInstance(Class.java:604)
            at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:936)
            at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:980)
            at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:227)
            at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:752)
            at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
            at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
            ... 13 more


    Voici mon projet : j'ai bien sur un launcher :

    AppLauncher.java :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package org.openjfx.ToDoListV2;
     
    public class AppLauncher {
     
    	public static void main(String[] args) {
    		App.main(args);
     
    	}
     
    }


    ce launcher apelle le main qui se situe dans la classe suivante :

    App.java :
    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
    package org.openjfx.ToDoListV2;
     
    import java.io.IOException;
     
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    import javafx.stage.StageStyle;
     
    /**
     * JavaFX App
     */
    public class App extends Application {
     
     
        private static Scene scene;
     
        @Override
        public void start(Stage stage) throws IOException {
        	System.out.println("okOK");
            scene = new Scene(loadFXML("/org/openjfx/ToDoListV2/primary"), 550, 400);
            stage.setScene(scene);
            stage.initStyle(StageStyle.UNDECORATED);
            stage.show();
        }
     
        static void setRoot(String fxml) throws IOException {
        	System.out.println("ok");
            scene.setRoot(loadFXML(fxml));
        }
     
        private static Parent loadFXML(String fxml) throws IOException {
            FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
            return fxmlLoader.load();
        }
     
        public static void main(String[] args) {
     
            launch();
        }
     
    }


    Et, c'est bien là que ça se gâte, lorsque je tente d'utiliser mon FXMLLoader !.
    normalement il devrait charger mon fichier primary.fxml que voici :

    primary.fxml

    Code xml :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
    58
    59
    60
    61
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.layout.VBox?>
    <?import javafx.scene.control.Label?>
    <?import javafx.scene.control.Button?>
    <?import javafx.geometry.Insets?>
    <?import javafx.scene.control.TextField?>
    <?import javafx.scene.layout.HBox?>
    <?import javafx.scene.Cursor?>
    <?import javafx.scene.control.ListView?>
     
    <VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" stylesheets="@../ToDoListV2/Main.css"  xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.openjfx.ToDoListV2.PrimaryController">
       <children>
       		<HBox prefHeight="30.0" prefWidth="200.0">
       			<children>
          			<TextField id="textField" fx:id="textField" onAction="#onEnter" prefHeight="30.0" prefWidth="569.0" />
          			<Button mnemonicParsing="false" onAction="#HandleExitButtonAction" prefHeight="30.0" prefWidth="30.0" text="X">
                   	<HBox.margin>
                      <Insets />
                   	</HBox.margin>
                	</Button>
       			</children>
       		</HBox>
       		<HBox prefHeight="55.0" prefWidth="600.0">
       			<children>
       				<Button mnemonicParsing="false" onAction="#HandleAddTaskButtonAction" text="ajouter une tache">
    					<opaqueInsets>
    						<Insets bottom="30.0" left="30.0" right="30.0" top="30.0" />
    					</opaqueInsets>
    					<cursor>
    						<Cursor fx:constant="HAND" />
    					</cursor>
    					<HBox.margin>
    						<Insets />
    					</HBox.margin>
    				</Button>
    				<Button  mnemonicParsing="false" onAction="#HandleRemoveTaskButtonAction" text="supprimer une tache">
    					<opaqueInsets>
    						<Insets bottom="30.0" left="30.0" right="30.0" top="30.0" />
    					</opaqueInsets>
    					<cursor>
    						<Cursor fx:constant="HAND" />
    					</cursor>
    					<HBox.margin>
    						<Insets />
    					</HBox.margin>
    				</Button>
       			</children>
       			<opaqueInsets>
    				<Insets />
    			</opaqueInsets>
    			<VBox.margin>
    				<Insets />
    			</VBox.margin>
       		</HBox>
       		<ListView id="listView" fx:id="listView" prefHeight="400.0" prefWidth="600.0" />
       	</children>
       <padding>
          <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
       </padding>
    </VBox>


    pour info voici la structure du projet :


    je pense que c'est un problème de chemin d'accès à mon fichier "primary.fxml"
    à noter que lors de la structure initiale du projet j'avais mes fichiers fxml bien rangés à part dans un dossier 'resources', puis lors de l'opération 'mvn clean package', maven m'a placé tout ca au même endroit que ma classe App, et que tout le reste d'ailleurs. toutes les ressources se trouvent au même endroit

  8. #8
    Rédacteur/Modérateur

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [...]
    Caused by: java.lang.NullPointerException
            at Utils.DataLoadSave.intializeObservable(DataLoadSave.java:47)
            at org.openjfx.ToDoListV2.PrimaryController.<init>(PrimaryController.java:18)
    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
    Membre à l'essai
    Oui !! un grand merci une fois de plus Bouye ! ca y est mon petit programme fonctionne enfin !!! je suis tellement content

    effectivement j'avais :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
                            ...
     
    ObservableList<Book> books = FXCollections.observableArrayList();
    		 BufferedReader reader = null;
    			try {
    				reader = Files.newBufferedReader(Paths.get("students.txt"));
     
    			} catch (IOException e) {
    				System.out.println(Paths.get("students.txt"));
    			}
     
    			 ...


    et je viens de me rendre compte que lors du package Maven n'a pas du tout copié ce petit fichier .txt !!
    j'ai copié collé le fichier .txt dans mon dossier /target....et miracle !!

    Je suis vraiment content d'être parvenu à créer ce fameux executable, j'aurais mis 10 jours!! je peux enfin avancer

    énorme merci !!

###raw>template_hook.ano_emploi###