¿Cómo hacer referencia a los archivos javafx fxml en la carpeta de recursos?

Estoy creando una aplicación de GUI javafx y mi proyecto es un proyecto configurado maven. Quiero poder hacer referencia a mis archivos fxml de esta manera en mis controladores:

FXMLLoader.load(getClass().getResource("main.fxml"); 

Donde mi archivo main.fxml está ubicado en la carpeta src / main / resources y mi controlador está en la carpeta src / main / java. ¿Cómo voy a hacer esto? Mi carpeta src / main / resources está en la ruta de comstackción y puedo llamar un archivo .properties que está en la carpeta src / main / resources de una clase en la carpeta src / main / java.

Editar

Intenté colocar el archivo fxml en el directorio correspondiente de la carpeta de recursos principales:

enter image description here

pero todavía tengo un error.

Ejemplo de uso

 FXMLLoader loader = new FXMLLoader(); loader.setLocation(getClass().getResource("/main.fxml")); Parent content = loader.load(); 

Opciones de resolución de ubicación

  1. Pon todo tu fxml en el directorio src / main / resources.

     loader.setLocation(getClass().getResource("/main.fxml")); 
  2. Pon todo tu fxml en un directorio src / main / resources / fxml.

     loader.setLocation(getClass().getResource("/fxml/main.fxml")); 
  3. Coloque el fxml en un directorio de recursos correspondiente; por ejemplo, src / main / resources / com / mycompany / myapp.

     loader.setLocation(getClass().getResource("main.fxml")); 

La última opción supone que la clase desde la que está cargando el archivo fxml está en la misma ubicación relativa en la jerarquía de origen Java correspondiente. Por ejemplo, puede invocar el último comando de carga desde el origen com.mycompany.myapp.Main.java .

Recomendaciones de uso de FXMLLoader

  1. Cree una instancia de un FXMLLoader a través de un new FXMLLoader() lugar de usar los métodos estáticos en el FXMLLoader .

    • Los métodos estáticos se vuelven confusos cuando quiere obtener valores (como controladores instanciados) de un cargador.
  2. Establezca la ubicación en el FXMLLoader instanciado y call load() lugar de cargar desde una secuencia usando load(stream) .

    • Establecer una ubicación basada en URL en el cargador permite la resolución de recursos relativos cargados en archivos fxml y css. Los recursos relativos no se resuelven para un constructor basado en secuencias.
  3. Para derivar una ubicación basada en una clase, use getClass().getResource() , ya que está basada en URL, en lugar de getClass().getResourceAsStream() que se basa en la transmisión.

IDE y configuraciones de comstackción

Asegúrese de que su IDE o herramienta de comstackción está copiando los archivos fxml desde el directorio de recursos al directorio de salida de comstackción. Para comprender la configuración de Intellij para esto, consulte: Cómo convertir un proyecto Java normal en intellij en un proyecto JavaFx .

Está utilizando FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("main.fxml") ); para cargar tu main.fxml Esto requiere que main.fxml y la clase java lo carguen en el mismo directorio / ruta. Si desea cargar un archivo fxml desde una ruta / ubicación diferente a la clase java que lo está cargando, debe usar la ruta relativa. Como @jewelsea mencionado anteriormente, puede usar la ruta relativa utilizando / character antes de su main.fxml. Entonces, el código que lo hará funcionar para usted en su caso es

 FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("/main.fxml") ); 

Abra su carpeta de recursos en el explorador de archivos de su sistema operativo. Aquí verá que ha creado una carpeta “dominio.application” en lugar de una carpeta “application” dentro de una carpeta “dominio”. Debido a esto, la clase “MainController” se coloca en un paquete diferente como archivo fxml.