javafx fxml fxmlloader

Por qué obtengo javafx.fxml.LoadException, incluso la ruta del archivo fxml es correcta



fxmlloader (2)

yo obtengo

javafx.fxml.LoadException:

Cuando estoy cargando un archivo fxml usando la siguiente línea de código.

AnchorPane anchorPane = (AnchorPane) loader.load ()

Este es mi archivo fxml, excluyendo las declaraciones de importación.

<AnchorPane prefHeight="537.0" prefWidth="374.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.buddhikajay.controller.NewTransactionDialogController"> <children> <GridPane hgap="5.0" layoutX="30.0" layoutY="10.0" prefHeight="544.0" prefWidth="314.0" vgap="5.0"> <columnConstraints> <ColumnConstraints hgrow="SOMETIMES" maxWidth="142.0" minWidth="10.0" prefWidth="69.0" /> <ColumnConstraints hgrow="SOMETIMES" maxWidth="226.0" minWidth="10.0" prefWidth="225.0" /> </columnConstraints> <rowConstraints> <RowConstraints maxHeight="70.0" minHeight="10.0" prefHeight="33.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="105.0" minHeight="10.0" prefHeight="38.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="156.0" minHeight="10.0" prefHeight="51.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="154.0" minHeight="10.0" prefHeight="43.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="160.0" minHeight="10.0" prefHeight="43.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="161.0" minHeight="10.0" prefHeight="63.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="301.0" minHeight="10.0" prefHeight="180.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="231.0" minHeight="10.0" prefHeight="106.0" vgrow="SOMETIMES" /> </rowConstraints> <padding> <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" /> </padding> <children> <Label text="ID" /> <Label text="Date" GridPane.rowIndex="1" /> <Label text="Amont" GridPane.rowIndex="2" /> <Label text="Person" GridPane.rowIndex="4" /> <Label text="Type" GridPane.rowIndex="3" /> <Label text="Resolved" GridPane.rowIndex="5" /> <Label /> <Label text="Description" GridPane.rowIndex="6" /> <TextField fx:id="idTextField" GridPane.columnIndex="1" /> <TextField fx:id="dateTextField" GridPane.columnIndex="1" GridPane.rowIndex="1" /> <TextField fx:id="amountTextField" GridPane.columnIndex="1" GridPane.rowIndex="2" /> <TextArea fx:id="descriptionTextArea" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="6" /> <HBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="225.0" spacing="20.0" GridPane.columnIndex="1" GridPane.rowIndex="7"> <GridPane.margin> <Insets /> </GridPane.margin> <padding> <Insets bottom="10.0" left="20.0" right="10.0" top="10.0" /> </padding> <children> <Button fx:id="okButton" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#okActionFired" prefHeight="25.0" prefWidth="75.0" text="Ok" /> <Button fx:id="cancleButton" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#cancleActionFired" prefHeight="25.0" prefWidth="75.0" text="Cancle" /> </children> </HBox> <ComboBox fx:id="typeComboBox" prefWidth="150.0" GridPane.columnIndex="1" GridPane.rowIndex="3" /> <ComboBox fx:id="personComboBox" prefWidth="150.0" GridPane.columnIndex="1" GridPane.rowIndex="4" /> <ComboBox fx:id="resolvedComboBox" prefWidth="150.0" GridPane.columnIndex="1" GridPane.rowIndex="5" /> </children> </GridPane> </children> </AnchorPane>

El compilador se queja de que hay un error en la línea número 1. Estoy seguro de que la ruta del archivo fxml es correcta. ¿Qué tiene de malo mi código?

Aquí está la pila de errores completa

javafx.fxml.LoadException: /C:/Users/Buddhika/Documents/Programming/IdeaProjects/VirtualCreditDesktop/out/production/VirtualCreditDesktop/com/buddhikajay/view/NewTransactionDialog.fxml:9 at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2595) at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:104) at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:928) at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:967) at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:216) at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:740) at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2701) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2521) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2435) at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2403) at com.buddhikajay.controller.NewTransactionDialogController.showNewTransactionDialog(NewTransactionDialogController.java:68) at com.buddhikajay.controller.MainApp.start(MainApp.java:51) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153(LauncherImpl.java:821) at com.sun.javafx.application.LauncherImpl$$Lambda$50/1976027283.run(Unknown Source) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(PlatformImpl.java:323) at com.sun.javafx.application.PlatformImpl$$Lambda$46/301541210.run(Unknown Source) at com.sun.javafx.application.PlatformImpl.lambda$null$164(PlatformImpl.java:292) at com.sun.javafx.application.PlatformImpl$$Lambda$48/474926796.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(PlatformImpl.java:291) at com.sun.javafx.application.PlatformImpl$$Lambda$47/1662429848.run(Unknown Source) 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.lambda$null$141(WinApplication.java:102) at com.sun.glass.ui.win.WinApplication$$Lambda$38/519284171.run(Unknown Source) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.InstantiationException: com.buddhikajay.controller.NewTransactionDialogController at java.lang.Class.newInstance(Class.java:423) at sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.java:51) at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:923) ... 23 more Caused by: java.lang.NoSuchMethodException: com.buddhikajay.controller.NewTransactionDialogController.<init>() at java.lang.Class.getConstructor0(Class.java:3074) at java.lang.Class.newInstance(Class.java:408) ... 25 more


El problema se describe en el seguimiento de la pila:

Caused by: java.lang.NoSuchMethodException: com.buddhikajay.controller.NewTransactionDialogController.()

que básicamente dice que tu clase de controlador no tiene un constructor de argumento cero.

Por defecto, FXMLLoader creará el controlador llamando a su constructor de argumento cero. Elimine el constructor que ha definido en la clase de controlador o elimine los parámetros que necesita.

Si realmente necesita pasar argumentos al constructor del controlador, puede crear el controlador en código Java y pasarlo al FXMLLoader:

NewTransactionDialogController controller = new NewTransactionDialogController(someValue); FXMLLoader loader = new FXMLLoader(); loader.setLocation(...); loader.setController(controller); AnchorPane anchorPane = loader.load();

(Con este código, debe eliminar el atributo fx:controller del FXML).

O configure una fábrica de controladores:

FXMLLoader loader = new FXMLLoader(); loader.setLocation(...); loader.setControllerFactory(clazz -> { if (clazz == NewTransactionDialogController.class) { return new NewTransactionDialogController(someValue); } else { // default behavior: try { return clazz.newInstance(); } catch (Exception exc) { throw new RuntimeException(exc); } } }); AnchorPane anchorPane = loader.load();

(En esta versión, deje el atributo fx:controller en el archivo FXML).


Estaba a punto de ingresar una pregunta diferente, como comentó @James_D para mi comentario porque hasta que leí la primera línea del FXML sobre esta pregunta, pensé que tenía un problema diferente.

Por mis pecados, reduje el desafío a un simple ejemplo de un solo controlador y dos archivos FXML. Uno funcionó y el segundo falló / falló.

El punto de partida es la muestra de Netbeans "[ Click me! ]". El código se pega a continuación. Y, primero una solución.

Como preámbulo, permítanme decir que parece que todos han estado culpando al controlador Java por estos errores de carga. Tuve un montón de errores como este en un proyecto hace un par de años. Agotamos la depuración del " controlador " y eventualmente avanzamos reconstruyendo las pantallas FXML con ScendBuilder. Entonces no tuve tiempo de investigar más.

La semana pasada, la pantalla FXML que funcionaba perfectamente comenzó a fallar al cargar porque la movimos a un directorio de tiempo de ejecución (anteriormente estaba en el área de recursos JAR).

KLUNK!

Después de 3 o 4 días ajustando eso y esto, hice un comentario aquí sobre mi error:

  • unknown path: 7
  • Javafx fxml LoadException: Error resolving onAction=''#handleButtonAction'', either the event handler is not in the Namespace or there is an error in the script.

Solo en el archivo " simple .fxml", pero no en el archivo " Scene .fxml". El archivo "simple.fxml" se reduce del archivo FXML de la aplicación que inicialmente dio el problema. Había demasiadas variables en ese archivo original, así que chop-chop-chop para que coincida con la demostración enlatada.

Cuando usa SOLO esto:

xmlns:fx="http://javafx.com/fxml"

Las cargas FXML de los archivos en el disco debajo de la carpeta de la aplicación funcionan exactamente como usted desea (bueno, como quiero, de todos modos). Mirando el FXML de arriba está usando un espacio de nombres más '' frágil '', a saber.

FXML original de Queston:

<AnchorPane ... xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" ... >

Al usar diff, lentamente transformé "simple.fxml" para estar lo más cerca posible de "Scene.fxml", y "simple" sigue sin poder cargarse. Tenga en cuenta; siempre usando el mismo controlador

La carga de FXML con otros metadatos no ha funcionado consistentemente, se movió un archivo FXML. No tengo una explicación de cómo es esto.

El FXML se mantiene en un directorio llamado "prueba / recursos / fxml / simple.fxml", por ejemplo. Cuando estaba compilando con ambos archivos en el proyecto JAR, el '' mismo '' FXML en ambos casos se cargó y funcionó como se esperaba. Para mí hay algo que no se dice sobre aspectos del proceso de carga de archivos. Nuevamente para mí, esto no es deseable porque el valor CLAVE de una definición de escena externa sería intercambio.

Este tipo de trampas de oso en el marcado XML que (aparentemente) no son recogidas por herramientas de desarrollo como SceneBuilder o FXMLLoader () son barreras para el progreso en proyectos en vivo que no tienen holgura para investigar rarezas esotéricas como esta.

Esto es testigo de nuestra experiencia previa en el proyecto: fue más fácil volver a editar una pantalla compleja con SceneBuilder en su conjunto que rastrear problemas de carga como este. La llamada a la acción es: Diagnósticos en la carga FXML : una pelusa FXML sería casi un requisito.

Controlador, SimpleController .java:

package ex.view.views; import java.net.URL; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Label; public class SimpleController implements Initializable { @FXML private Label label; @FXML private void handleButtonAction(ActionEvent event) { System.out.println("You clicked me!"); label.setText("Hello World!"); } @Override public void initialize(URL url, ResourceBundle rb) { // TODO } }

El FXML defectuoso comenzó como uno de los arquetipos de Maven ( creo ) y ese archivo funcionó bien hasta que moví los archivos FXML a una carpeta y los cargué desde un InputStream .

He formateado el marcado AnchorPane en varias líneas para facilitar la lectura.

simple.fxml:

<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.Label?> <?import javafx.scene.layout.AnchorPane?> <AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ex.view.views.SimpleController"> <children> <Button fx:id="button" layoutX="126" layoutY="90" text="Click Me!" /> <Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" /> </children> </AnchorPane>

El marcado FXML de trabajo es de las muestras de Netbeans 8.1.

Scene.fxml:

<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import java.util.*?> <?import javafx.scene.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml" fx:controller="ex.view.views.SimpleController"> <children> <Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" /> <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" /> </children> </AnchorPane>