InvocationTargetException при запуске программы javafx

Итак, это работало в примере с javafx, когда My pc имел jdk 1.7.0, так что это может быть новая версия FX в java8, однако

Я получаю красивую трассировку стека

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

в основном говорит мне что-то не так здесь "com/rpg/gui/main.fxml:11"

и эта строка

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.rpg.gui.MainController">

поэтому я могу понять, что ему не нравится что-то делать с основным контроллером, так что это должно быть связано с загрузкой fxml и контроллера? но это о том, где заканчиваются мои идеи.

MainController mainController = new MainController(path);
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
Window.setMainController(mainController);
Window.swap(path+"content.fxml");

что метод он бросает все в любом, кто имеет опыт работы в javaFX, или знает какие-либо изменения в java8, которые это сделают??

Ответы

Ответ 1

В вашем MainController нет конструктора с нулевым аргументом. Если FXMLLoader встречает атрибут fx:controller в корневом элементе, он пытается создать экземпляр этого контроллера (эффективно), вызывая конструктор нулевого аргумента класса, указанного в атрибуте.

Чтобы исправить это (самый простой способ), удалить атрибут fx:controller из файла FXML и установить контроллер "вручную" на FXMLLoader. Вам нужно создать экземпляр FXMLLoader вместо того, чтобы полагаться на статический метод load(...):

FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
loader.setController(new MainController(path));
Pane mainPane = loader.load();

Ответ 2

Я также сталкиваюсь с этим много... Кажется, что в Scenebuilder/netbeans 8 есть ошибка, где при сохранении в Scenebuilder он создает еще один xmlns: fx = "...", так что это может быть проблемой...

Кроме того, глядя на fxml, я использую java8, у меня есть следующие: xmlns = "http://javafx.com/javafx/8" xmlns: fx = "http://javafx.com/fxml/1"

где я заметил, что вы: XMLNS: FX = "http://javafx.com/fxml"

Ответ 3

Я столкнулся с той же проблемой и хочу поделиться с ней немного. Я использую java 8 и Netbeans 8.1, и когда я создал java-приложение FXML, я получил его.
Вот несколько советов:

  • При создании нового проекта очистить и построить ваш проект, прежде чем пытаться запустить.
  • Если вы переименуете какой-либо файл (контроллер, fxml), IDE не применяет изменения к другим файлам, по крайней мере, Netbeans этого не делает. Таким образом, вы должны изменить эти имена файлов в других файлах вручную.
  • Вы можете определить контроллер либо в файле fxml, либо в классе main. Если вы хотите определить контроллер в классе main, используйте метод, описанный @James_D. Если вы хотите определить в файле fxml, чем использовать атрибут fx:controller как

     fx:controller="yourProjectName.yourFXMLDocumentControllerName"
    

    и в основном классе ссылайтесь на него как

    Parent root = FXMLLoader.load(getClass().getResource("yourFXMLFileName.fxml"));
    
  • Если вы считаете, что все правильно, но вы все еще получаете ошибку очистить и создаете свой проект еще раз и попробуйте запустить.

Надеюсь, что это поможет кому-то.

Ответ 4

Вы использовали Используйте

Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));

попробуйте

Pane mainPane = FXMLLoader.load(getClass().getResource("/main.fxml"));