Donc, cela a fonctionné dans l'exemple de javafx quand Mon pc avait jdk 1.7.0, donc cela pourrait être la nouvelle version de FX en Java8 cependant;
Je reçois une belle trace de pile
jfx-project-run:
Executing E:\workspace\PathFinderApp\dist\run1095471771\PathFinderApp.jar using platform C:\Program Files\Java\jdk1.8.0\jre/bin/Java
Exception in Application start method
Java.lang.reflect.InvocationTargetException
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:483)
at com.Sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.Java:367)
at com.Sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.Java:305)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:483)
at Sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.Java:767)
Caused by: Java.lang.RuntimeException: Exception in Application start method
at com.Sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.Java:894)
at com.Sun.javafx.application.LauncherImpl.access$000(LauncherImpl.Java:56)
at com.Sun.javafx.application.LauncherImpl$1.run(LauncherImpl.Java:158)
at Java.lang.Thread.run(Thread.Java:744)
Caused by: javafx.fxml.LoadException:
file:/E:/workspace/PathFinderApp/dist/run1095471771/PathFinderApp.jar!/com/rpg/gui/main.fxml:11
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.Java:2617)
at javafx.fxml.FXMLLoader.access$700(FXMLLoader.Java:104)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.Java:937)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.Java:976)
at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.Java:216)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.Java:738)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.Java:2723)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:3230)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:3191)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:3164)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:3140)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:3120)
at javafx.fxml.FXMLLoader.load(FXMLLoader.Java:3113)
at com.rpg.gui.GUI.loadMainPane(GUI.Java:34)
at com.rpg.gui.GUI.initialize(GUI.Java:20)
at Main.start(Main.Java:20)
at com.Sun.javafx.application.LauncherImpl$8.run(LauncherImpl.Java:837)
at com.Sun.javafx.application.PlatformImpl$7.run(PlatformImpl.Java:335)
at com.Sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.Java:301)
at com.Sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.Java:298)
at Java.security.AccessController.doPrivileged(Native Method)
at com.Sun.javafx.application.PlatformImpl$6.run(PlatformImpl.Java:298)
at com.Sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.Java:95)
at com.Sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.Sun.glass.ui.win.WinApplication.access$300(WinApplication.Java:39)
at com.Sun.glass.ui.win.WinApplication$4$1.run(WinApplication.Java:112)
... 1 more
Caused by: Java.lang.InstantiationException: com.rpg.gui.MainController
at Java.lang.Class.newInstance(Class.Java:418)
at Sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.Java:51)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.Java:932)
... 26 more
Caused by: Java.lang.NoSuchMethodException: com.rpg.gui.MainController.<init>()
at Java.lang.Class.getConstructor0(Class.Java:2971)
at Java.lang.Class.newInstance(Class.Java:403)
... 28 more
Exception running application Main
Java Result: 1
essentiellement en me disant que quelque chose ne va pas ici "com/rpg/gui/main.fxml:11"
et cette ligne est
<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.rpg.gui.MainController">
donc je peux comprendre que ça n'aime pas quelque chose à voir avec le contrôleur principal, donc ça doit être quelque chose à voir avec le chargement du fxml et du contrôleur, n'est-ce pas? mais c'est à peu près là où finissent mes idées
MainController mainController = new MainController(path);
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
Window.setMainController(mainController);
Window.swap(path+"content.fxml");
c'est la méthode qu'il jette dans n'importe qui expérimenté dans javaFX ou sait des changements dans Java8 qui feraient ceci ??
Votre MainController
n'a pas de constructeur à zéro argument. Si la variable FXMLLoader
rencontre un attribut fx:controller
sur l'élément racine, elle tente de créer une instance de ce contrôleur en appelant (de manière effective) le constructeur à argument zéro de la classe spécifiée dans l'attribut.
Pour résoudre ce problème (le moyen le plus simple), supprimez l'attribut fx:controller
du fichier FXML , et définissez le contrôleur "à la main" sur la FXMLLoader
. Vous devez créer une instance FXMLLoader
au lieu de vous appuyer sur la méthode statique load(...)
:
FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
loader.setController(new MainController(path));
Pane mainPane = loader.load();
J'ai fait face au même problème et je veux partager un peu le sujet. J'utilise Java 8 et Netbeans 8.1 et lorsque j'ai créé une application javafx FXML, je l'ai obtenue.
Voici quelques conseils:
Vous pouvez définir le contrôleur dans le fichier fxml
ou dans la main
classe . Si vous souhaitez définir le contrôleur dans la classe main
, utilisez la méthode décrite par @James_D . Si vous souhaitez définir dans le fichier fxml
, utilisez l'attribut fx:controller
comme
fx:controller="yourProjectName.yourFXMLDocumentControllerName"
et dans la classe principale référence comme
Parent root = FXMLLoader.load(getClass().getResource("yourFXMLFileName.fxml"));
J'espère que cela aiderait quelqu'un.
Je rencontre aussi souvent cela ... Il semble y avoir un bogue dans Scenebuilder/netbeans 8, qui, lors de la sauvegarde dans Scenebuilder, crée un autre xmlns: fx = "...", ce qui peut poser problème ...
En outre, en regardant les fichiers fxml que j’utilise avec Java8, j’ai les informations suivantes: Xmlns = "http://javafx.com/javafx/8" xmlns: fx = "http://javafx.com/fxml/1"
où j'ai remarqué que le votre est: xmlns: fx = "http://javafx.com/fxml"
Vous avez utilisé
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
Essayer
Pane mainPane = FXMLLoader.load(getClass().getResource("/main.fxml"));
Pour tous ceux qui luttent avec JDK11/JavaFX11
La raison pour laquelle j'ai eu cette erreur est parce que le projet dépendait de Un module d'interface utilisateur qui contenait les références FXML et donc la configuration graphique . J'ai remarqué ces lignes dans le vidage du journal de compilation ci-dessous:
Causé par: Java.lang.IllegalAccessException: Class com.Sun.javafx.application.LauncherImpl (dans le module javafx.graphics) ne peut pas accéder à Class academy.learnprogramming.ui.Main (dans le module academy.learnprogramming.common ) parce que module academy.learnprogramming.common n'exporte pas academy.learnprogramming.ui dans le module javafx.graphics
Alors
En supposant que ceci ne soit PAS un projet maven, Nom du projet/nom du module/src/module-info.Java vous devez vous assurer que le système de modules a accès à tous vos modules du projet:
module com.test.common {
requires javafx.fxml;
requires javafx.controls;
requires javafx.graphics;
requires Java.sql;
// ... etc.
opens com.test.common;
opens com.test.ui; // For my particular case, I had Forgotten this one
opens com.test.db; // And this one
}
POUR RÉFÉRENCE:
Exception in Application constructor
Exception in thread "main" Java.lang.reflect.InvocationTargetException
at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.base/Java.lang.reflect.Method.invoke(Method.Java:566)
at Java.base/Sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.Java:1051)
Caused by: Java.lang.RuntimeException: Unable to construct Application instance: class academy.learnprogramming.ui.Main
at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.Java:890)
at javafx.graphics/com.Sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.Java:195)
at Java.base/Java.lang.Thread.run(Thread.Java:834)
Caused by: Java.lang.IllegalAccessException: class com.Sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class academy.learnprogramming.ui.Main (in module academy.learnprogramming.common) because module academy.learnprogramming.common does not export academy.learnprogramming.ui to module javafx.graphics
at Java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.Java:361)
at Java.base/Java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.Java:591)
at Java.base/Java.lang.reflect.Constructor.newInstance(Constructor.Java:481)
at javafx.graphics/com.Sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.Java:802)
at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.Java:455)
at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.Java:428)
at Java.base/Java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.Java:427)
at javafx.graphics/com.Sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.Java:96)
at javafx.graphics/com.Sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.Sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.Java:174)
... 1 more
Si Any One ne résout pas le problème en suivant les réponses, le moyen le plus simple est de créer une nouvelle classe vide fxml, puis cliquez sur edit du fichier fxml causant le problème et copiez le code xml dans la nouvelle classe. Accédez à la méthode start (), modifiez le:
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
à
Pane mainPane = FXMLLoader.load(getClass().getResource("newClass.fxml"));