InvocationTargetException lors de l'exécution d'un programme javafx
donc cela a fonctionné dans l'exemple de javafx quand mon pc avait JDK 1.7.0 donc cela peut être la nouvelle version de FX dans java8 cependant;
je reçois un bon stack-trace
jfx-project-run:
Executing E:workspacePathFinderAppdistrun1095471771PathFinderApp.jar using platform C:Program FilesJavajdk1.8.0jre/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.access0(LauncherImpl.java:56)
at com.sun.javafx.application.LauncherImpl.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.access0(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.run(LauncherImpl.java:837)
at com.sun.javafx.application.PlatformImpl.run(PlatformImpl.java:335)
at com.sun.javafx.application.PlatformImpl.run(PlatformImpl.java:301)
at com.sun.javafx.application.PlatformImpl.run(PlatformImpl.java:298)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.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.access0(WinApplication.java:39)
at com.sun.glass.ui.win.WinApplication.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
en gros, me dire que quelque chose ne va pas ici "com/rpg/gui/main.fxml:11"
et c'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 qu'il n'aime pas quelque chose à faire avec le contrôleur principal, donc il doit y avoir quelque chose à faire avec le chargement du fxml et du contrôleur n'est-ce pas? mais c'est à peu près où mes idées pour la fin
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 qui jette tout dans n'importe qui expérimenté dans javaFX ou connaître des changements dans java8 qui ferait cela??
5 réponses
MainController
n'a pas un zéro en argument du constructeur. Si le FXMLLoader
rencontres fx:controller
attribut sur l'élément root, il tente de créer une instance de ce controller en appelant (effectivement) le constructeur à argument zéro de la classe spécifiée dans l'attribut.
Pour la résoudre (le plus simple), supprimer fx:controller
attribut du fichier FXML, et de régler le contrôleur "à la main" sur le FXMLLoader
. Vous devez créer un FXMLLoader
instance à la place de s'appuyer sur la statique load(...)
méthode:
FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
loader.setController(new MainController(path));
Pane mainPane = loader.load();
j'ai connu le même problème et que vous voulez partager un peu lié. J'utilise java 8 et Netbeans 8.1 et quand j'ai créé une Application javafx FXML j'ai eu celle-ci.
Voici quelques conseils:
- Lorsque vous créez un nouveau projet nettoyer et créer votre projet avant d'essayer de courir.
- si vous renommez un fichier (controller, fxml) IDE n'appliquez pas de modifications à D'autres fichiers au moins Netbeans ne le fait pas. Donc, vous avez à changer ces noms de fichiers dans d'autres fichiers manuellement.
vous pouvez définir controller dans
fxml
fichier ou dansmain
classe. Si vous souhaitez définir contrôleurmain
classe utilisez la méthode décrite par @James_D. Si vous souhaitez définir enfxml
le fichier que d'utiliserfx:controller
l'attributfx:controller="yourProjectName.yourFXMLDocumentControllerName"
et dans la classe principale référence
Parent root = FXMLLoader.load(getClass().getResource("yourFXMLFileName.fxml"));
- Si vous pensez que tout est correct, mais vous obtenez toujours l'erreur nettoyer et créer votre projet à nouveau et essayer de courir.
j'Espère que cela aiderait quelqu'un.
je rencontre également que beaucoup de... Il semble y avoir un bug dans Scenebuilder/netbeans 8, où après avoir enregistré dans Scenebuilder, il crée un autre xmlns:fx="..."de sorte que peut être un problème...
aussi, en regardant les fxml que j'ai en utilisant java8, j'ai ceci: xmlns="http://javafx.com/javafx/8" xmlns: fx="http://javafx.com/fxml/1"
où j'ai remarqué votre est: xmlns: fx="http://javafx.com/fxml"
Vous avez utilisé
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
Pane mainPane = FXMLLoader.load(getClass().getResource("/main.fxml"));
si Quelqu'un ne corrige pas le problème en suivant les réponses, la manière simple est de créer une nouvelle classe vide FXML puis cliquez sur modifier du fxml causin le problème et copier le code xml pour la nouvelle classe . Allez à démarrer() methode, de modifier la:
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
Pane mainPane = FXMLLoader.load(getClass().getResource("newClass.fxml"));