start - javafx ejemplos
InvocationTargetException al ejecutar un programa javafx (6)
Me enfrenté al mismo problema y quiero compartir un poco relacionado con él. Estoy usando java 8 y Netbeans 8.1 y cuando creé una aplicación javafx FXML obtuve esta.
Aquí hay algunos consejos:
- Cuando creas un nuevo proyecto, limpia y crea tu proyecto antes de intentar ejecutarlo.
- Si cambia el nombre de cualquier archivo (controlador, fxml), el IDE no aplica cambios a otros archivos, al menos Netbeans no lo está haciendo. Entonces, tienes que cambiar esos nombres de archivo en otros archivos manualmente.
Puede definir el controlador en el archivo
fxml
o en la clasemain
. Si desea definir el controlador en la clasemain
, use el método descrito por @James_D . Si desea definir en el archivofxml
, use el atributofx:controller
comofx:controller="yourProjectName.yourFXMLDocumentControllerName"
y en la clase principal la referencia como
Parent root = FXMLLoader.load(getClass().getResource("yourFXMLFileName.fxml"));
- Si crees que todo es correcto, pero aún así obtienes el error de limpieza y crea tu proyecto nuevamente e intenta ejecutarlo.
Espero que ayude a alguien.
Así que esto funcionó en el ejemplo de javafx cuando Mi PC tenía jdk 1.7.0 por lo que esta podría ser la nueva versión de FX en java8;
Me sale una buena pila de seguimiento
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
básicamente me dice que algo está mal aquí "com/rpg/gui/main.fxml:11"
y esa linea es
<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.rpg.gui.MainController">
así que puedo darme cuenta de que no tiene nada que ver con el controlador principal, así que tiene que ver con cargar el fxml y el controlador, ¿no? pero eso es donde terminan mis ideas
MainController mainController = new MainController(path);
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
Window.setMainController(mainController);
Window.swap(path+"content.fxml");
ese es el método que arroja todo en cualquier persona con experiencia en javaFX o saber de cualquier cambio en java8 que haría esto?
Para cualquier persona que lucha con JDK11 / JavaFX11
La razón por la que recibí este error es porque el proyecto dependía de un módulo de IU que contenía las referencias FXML y, por lo tanto, la configuración de gráficos. Noté estas líneas en el volcado de registro de compilación a continuación:
Causado por: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (en el módulo javafx.graphics) no puede acceder a la clase academy.learnprogramming.ui.Main (en el módulo academy.learnprogramming.common) porque el módulo academy.learnprogramming .common no exporta academy.learnprogramming.ui al módulo javafx.graphics
Asi que
Suponiendo que este NO es un proyecto experto, Project / nombre-módulo / src / módulo-info.java que necesitaba para asegurarse de que el sistema de módulos tuviera acceso a todos sus módulos en el proyecto:
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
}
PARA REFERENCIA:
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 no resuelve el problema siguiendo las respuestas, la forma más sencilla es crear una nueva clase vacía de fxml, luego hacer clic en editar el fxml que causa el problema y copiar el código xml a la nueva clase. Vaya al método start (), cambie el:
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
a
Pane mainPane = FXMLLoader.load(getClass().getResource("newClass.fxml"));
Su MainController
no tiene un constructor de cero argumentos. Si FXMLLoader
encuentra un atributo fx:controller
en el elemento raíz, intenta crear una instancia de ese controlador llamando (de manera efectiva) al constructor de argumento cero de la clase especificada en el atributo.
Para solucionar esto (la forma más sencilla), elimine el atributo fx:controller
del archivo FXML y configure el controlador "a mano" en FXMLLoader
. FXMLLoader
crear una instancia de FXMLLoader
lugar de confiar en el método de load(...)
estática load(...)
:
FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
loader.setController(new MainController(path));
Pane mainPane = loader.load();
También me parece mucho eso ... Parece que hay un error en Scenebuilder / netbeans 8, donde al guardar en Scenebuilder, crea otro xmlns: fx = "...", por lo que puede ser un problema ...
Además, mirando los fxml que tengo usando java8, tengo estos: xmlns = "http://javafx.com/javafx/8" xmlns: fx = "http://javafx.com/fxml/1"
donde noté que está es: xmlns: fx = "http://javafx.com/fxml"
Usaste
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
Tratar
Pane mainPane = FXMLLoader.load(getClass().getResource("/main.fxml"));