JavaFX “La ubicación es obligatoria”, aunque esté en el mismo paquete

Estoy tratando de ejecutar mi progtwig JavaFX, pero estoy teniendo algunas dificultades. Sigo recibiendo un error de ‘java.lang.NullPointerException: la ubicación es obligatoria’. El archivo fxml está en el mismo paquete que la clase de aplicación. Aquí está mi código muy simple:

package com.kromalights.designer.entry; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception{ Parent root = FXMLLoader.load(getClass().getResource("main.fxml")); primaryStage.setTitle("Kromalights Designer"); primaryStage.setScene(new Scene(root, 300, 275)); primaryStage.show(); } public static void main(String[] args) { launch(args); } } 

Y aquí hay una copia de mi archivo main.fxml:

                        

La clase de controlador existe y está en el paquete especificado en el archivo fxml. Todos mis nombres son correctos y están donde creo que deberían estar. ¿Qué me estoy perdiendo? Intenté cambiar el nombre de mi archivo fxml por si se trataba de un problema de nombre. Por favor ayuda. FYI, estoy usando Intellij IDEA en OSX.

ACTUALIZACIÓN: Este es un problema Maven. Configuré Maven para este proyecto y eso causó el problema. Eliminé a Maven temporalmente para poder seguir trabajando sin él. ¿Alguien tiene alguna idea de cómo manejaría mejor esto cuando use Maven?

En mi caso, todo lo anterior no fue el problema en absoluto.

Mi problema se resolvió cuando lo reemplacé:

 getClass().getResource("ui_layout.fxml") 

con :

 getClass().getClassLoader().getResource("ui_layout.fxml") 

Mover el archivo al directorio principal / recursos funcionó.

 URL url = new File("src/main/java/ua/adeptius/goit/sample.fxml").toURL(); Parent root = FXMLLoader.load(url); 

Eso se ayudó para mí porque

 getClass.getResource("path") 

siempre me devuelve nulo;

He visto este error algunas veces. Tan a menudo que escribí un pequeño proyecto, llamado “Simple” con una plantilla de aplicación Netbeans Maven FXML para volver a utilizarlo como una especie de “modelo de referencia” cuando las cosas van mal. Para las pruebas, uso algo como esto:

  String sceneFile = "/fxml/main.fxml"; Parent root = null; URL url = null; try { url = getClass().getResource( sceneFile ); root = FXMLLoader.load( url ); System.out.println( " fxmlResource = " + sceneFile ); } catch ( Exception ex ) { System.out.println( "Exception on FXMLLoader.load()" ); System.out.println( " * url: " + url ); System.out.println( " * " + ex ); System.out.println( " ----------------------------------------\n" ); throw ex; } 

Cuando ejecuta ese fragmento y la carga falla, debería ver un motivo, o al menos un mensaje del FXMLLoader. Como es una prueba, arrojo la excepción. No quieres continuar

Cosas a tener en cuenta. Este es un proyecto de maven, por lo que los recursos serán relativos a la carpeta de recursos, por lo tanto:

  • “/fxml/main.fxml”.
  • La barra diagonal es requerida.
  • El recurso pasado al FXMLLoader distingue entre mayúsculas y minúsculas :

     // If you load "main.fxml" and your file is called: "Main.fxml" // You will will see the message ... java.lang.NullPointerException: Location is required. 
  • Si supera ese problema de “la ubicación es obligatoria”, entonces puede tener un problema en el FXML

    // Algo como esto: // javafx.fxml.LoadException: file: / D: /sandbox/javafx/app_examples/person/target/person-00.00.01-SNAPSHOT.jar! /Fxml/tableWithDetails.fxml: 13

Significará que hay un problema en la Línea 13 , en el archivo, por:

  • tableWithDetails.fxml : 13

En el mensaje En este punto, necesita leer el FXML y ver si puede detectar el problema. Puede probar algunos de los consejos en la pregunta relacionada.

Para este problema, mi opinión es que el nombre del archivo era correcto: “Main.fxml”. Cuando se movió el archivo, es probable que el nombre haya cambiado o que la cadena haya sido reescrita. Buena suerte.

Relacionado:

  • Herramienta (s) de diagnóstico de error FXML / FXMLLoader buscada

en lugar de

Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));

poner

Parent root = FXMLLoader.load(getClass().getResource("/main.fxml"));

La diferencia es de “/”.

Motivo:

Primero: getResource intentará encontrar el recurso relativo al paquete

2º: getResource lo tratará como una ruta absoluta y simplemente llamará al cargador de clases.

Este problema puede deberse a una ruta incorrecta al archivo FXML.

Si está utilizando rutas absolutas ( my/package/views/view.fxml ), debe preceder con una barra inclinada:

 getClass().getResource("/my/package/views/view.fxml") 

También puede usar rutas relativas:

 getClass().getResource("views/view.fxml") 

No pude usar

 getClass().getResource("views/view.fxml") 

porque puse mi clase de controlador en el paquete de “controladores”, así que aquí está mi solución:

 getClass().getResource("../views/view.fxml") 

Estaba obteniendo el mismo error. En mi caso, había un espacio-símbolo adelantado en el nombre del archivo fxml:

“fxml_example.fxml” en lugar de “fxml_example.fxml”

No sé de dónde vino. Fue muy difícil notarlo. Cuando eliminé el espacio principal, todo salió bien. Ni siquiera sabía que el nombre del archivo podría comenzar con el espacio-símbolo.

Si su problema no está relacionado con Maven y obtiene la misma NullPointerException ejecutando esto en un navegador (mientras lo ejecuta desde el IDE está bien), intente esto:

-> Netbeans -> Proyecto de clic derecho -> Propiedades -> Comstackción -> Implementación -> Marque “Solicitar acceso sin restricciones (Habilitar firma, autofirmado)”

Esto se debe a la anotación @FXML que necesita permiso para inyectar el valor del marcado de FXML (ver http://docs.oracle.com/javafx/2/fxml_get_started/fxml_deployment.htm )

Estaba ejecutando mi aplicación en JDK8u31 y nunca se ejecutaría sin el certificado en Chrome / Firefox / IE.

El directorio raíz para el cargador se encuentra en la carpeta ‘recursos’ para un proyecto maven. Entonces, si tiene src/main/java , la ruta del archivo fxml debe comenzar desde: src/main/resources

https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

Si su proyecto está basado en Maven, Idea ignorará todos los archivos java en su carpeta src / main / java. Como dijiste moviendo el archivo a src / main / resources funciona, pero ahora SceneBuilder ya no sabe acerca de tu clase de controlador porque está en un directorio completamente diferente y pierdes toda la información, creas a ciegas.

Creo que esto es un problema en intellij ya que SceneBuilder EXPECTA para encontrar el archivo java de su clase de controlador en (y cito) “el mismo directorio, un subdirectorio directo o el directorio padre del documento .fxml”.

A veces tenía la misma excepción.

Cuando creo un archivo FXML con el asistente en Eclipse, escribo example.fxml en el campo de nombre. Eclipse crea un archivo, como example.fxml.fxml . Con este error, FXMLLoader no puede encontrar el archivo FXML correcto. Entonces, mi consejo, verifique el nombre del nombre de archivo FXML en su método de inicio y el nombre real del archivo.

Espero poder ayudar. Buena suerte.

Si miras los documentos [1], ves que el método load() puede tomar una URL:

 load(URL location) 

Entonces, si está ejecutando Java 7 o posterior, puede cargar el archivo FXML así:

 URL url = Paths.get("./src/main/resources/fxml/Fxml.fxml").toUri().toURL(); Parent root = FXMLLoder.load(url); 

Este ejemplo es de un proyecto de Maven, por lo que el archivo FXML se encuentra en la carpeta de recursos.

[1] https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/FXMLLoader.htm

Simplemente le pasé al cargador una URL adecuada como esta:

 URL url = getClass().getResource("myForm.fxml"); Parent root = FXMLLoader.load(url);