web-dev-qa-db-fra.com

JavaFX "Emplacement requis." même si c'est dans le même paquet

J'essaie de faire fonctionner mon programme JavaFX, mais j'ai quelques difficultés. Je continue à recevoir une erreur de 'Java.lang.NullPointerException: l'emplacement est requis.' Le fichier fxml est dans le même package que la classe Application. Voici mon code très 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);
    }
}

Et voici une copie de mon fichier main.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import Java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>
<?scenebuilder-stylesheet mailStyles.css?>
<?import Java.net.*?>

<BorderPane prefHeight="300.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml/1"
        xmlns="http://javafx.com/javafx/2.2"
        fx:controller="com.kromalights.designer.entry.Controller">
    <bottom>
        <Pane prefHeight="200.0" prefWidth="200.0"/>
    </bottom>
    <center>
        <Pane prefHeight="200.0" prefWidth="200.0"/>
    </center>
    <left>
        <VBox prefHeight="200.0" prefWidth="100.0"/>
    </left>
    <top>
        <HBox prefHeight="100.0" prefWidth="200.0"/>
    </top>
    <stylesheets>
        <URL value="@mainStyles.css" />
    </stylesheets>
</BorderPane>

La classe de contrôleur existe et se trouve dans le package spécifié dans le fichier fxml. Tous mes noms sont corrects et sont où je pense qu'ils devraient être. Qu'est-ce que je rate? J'ai essayé de renommer mon fichier xml au cas où il s'agirait d'un problème de nom. S'il vous plaît aider. Pour votre information, j'utilise Intellij IDEA sur OSX.

MISE À JOUR: Ceci est un problème Maven. J'ai configuré Maven pour ce projet et cela a causé le problème. J'ai retiré Maven temporairement pour pouvoir continuer à travailler sans lui. Quelqu'un at-il une idée de la meilleure façon de gérer cela avec Maven?

37
Gremash

Déplacer le fichier dans le répertoire principal/ressources a fonctionné.

34
Gremash

Dans mon cas, tout ce qui précède n'était pas le problème du tout.

Mon problème a été résolu quand j'ai remplacé:

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

avec : 

getClass().getClassLoader().getResource("ui_layout.fxml")
61
Amir Arad

J'ai vu cette erreur plusieurs fois maintenant. Si souvent que j'ai écrit un petit projet, appelé "Simple" avec un modèle d'application Netbeans Maven FXML, pour revenir à une sorte de "modèle de référence" lorsque tout se passe de travers. Pour tester, j'utilise quelque chose comme ceci:

    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;
    }

Lorsque vous exécutez cet extrait et que le chargement échoue, vous devez voir une raison, ou au moins un message du FXMLLoader. Puisqu'il s'agit d'un test, je jette l'exception. Tu ne veux pas continuer.

Choses à noter. Ceci est un projet maven, les ressources seront donc relatives au dossier de ressources, d’où:

  • "/fxml/main.fxml".
  • La barre oblique est requise.
  • La ressource transmise à FXMLLoader est sensible à la casse:

    // 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 vous avez dépassé ce problème "location is required", vous pouvez avoir un problème dans le fichier FXML.

    // Quelque chose comme ça: // javafx.fxml.LoadException: fichier:/D: /sandbox/javafx/app_examples/person/target/person-00.00.01-SNAPSHOT.jar! /fxml/tableWithDetails.fxml: 13

Cela signifie-t-il qu'il y a un problème sur Line 13, dans le fichier, par:

  • tableWithDetails.fxml : 13

Dans le message À ce stade, vous devez lire le FXML et voir si vous pouvez localiser le problème. Vous pouvez essayer certains des conseils de la question correspondante.

Pour ce problème, mon avis est que le nom du fichier était le cas approprié: "Main.fxml". Lorsque le fichier a été déplacé, le nom a probablement été modifié ou la chaîne a été retapée. Bonne chance.

En relation:

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

Cela m’a aidé parce que 

getClass.getResource("path")

me retourne toujours nul;

18
Adeptius

Je ne pouvais pas utiliser

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

parce que je mets ma classe de contrôleurs dans le paquet "contrôleurs", voici donc ma solution:

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

Ce problème peut être dû à un chemin incorrect vers le fichier FXML.

Si vous utilisez des chemins absolus (my/package/views/view.fxml), vous devez alors précéder d'une barre oblique:

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

Vous pouvez également utiliser des chemins relatifs:

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

J'avais la même erreur. Dans mon cas, il y avait un espace-symbole en tête dans le nom du fichier fxml:

"fxml_example.fxml" au lieu de "fxml_example.fxml"

Je ne sais pas d'où ça vient. C'était très difficile de le remarquer. Quand j'ai enlevé l'espace de début, tout s'est bien passé. Je ne savais même pas que ce nom de fichier pouvait commencer par le symbole d'espace.

2
Evaldas Ilginis

Si votre problème n'est pas lié à Maven et que vous obtenez la même exception NullPointerException si vous l'exécutez dans un navigateur (si vous l'exécutez à partir de IDE), essayez ceci:

-> Netbeans -> Projet avec le bouton droit de la souris -> Propriétés -> Construire -> Déploiement -> Cochez "Demander un accès illimité (Activer la signature, Auto-signé)"

Cela est dû au fait que l'annotation @FXML a besoin de l'autorisation pour injecter le fichier valeur du balisage FXML (voir http://docs.Oracle.com/javafx/2/fxml_get_started/fxml_deployment.htm )

J'exécutais mon application sur JDK8u31 et elle ne fonctionnerait jamais sans le certificat dans Chrome/Firefox/IE.

2
mroesler

Si vous regardez la documentation [1], vous voyez que la méthode load() peut prendre une URL:

load(URL location)

Ainsi, si vous utilisez Java 7 ou une version plus récente, vous pouvez charger le fichier FXML comme suit:

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

Cet exemple provient d'un projet Maven, c'est pourquoi le fichier FXML se trouve dans le dossier des ressources.

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

2
james.garriss

Le répertoire racine du chargeur se trouve dans le dossier 'resources' d'un projet maven. Donc, si vous avez src/main/Java, le chemin du fichier xml devrait commencer à partir de: src/main/resources

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

1
Thomas Bratt

J'ai trouvé que toutes les solutions ci-dessus fonctionnent parfaitement car elles déclenchent la reconstruction du projet par votre IDE. Aucune magie impliquée.

La "vraie" solution à ce problème consiste à abandonner votre répertoire de construction précédent. 

  • Si vous utilisez Maven, supprimez simplement le dossier cible (ou effectuez un nettoyage de MVN)!
  • Si vous utilisez ANT, supprimez ce dossier respectif (je pense qu’il est appelé)!
  • Si vous utilisez Gradle, supprimez le dossier de construction!
0
John Smith

Si votre projet est basé sur Maven, Idea ignorera tous les fichiers sauf les fichiers Java de votre dossier src/main/Java. Comme vous l'avez dit, le déplacement du fichier vers src/main/resources fonctionne, mais SceneBuilder ne connaît plus votre classe de contrôleur car il se trouve dans un répertoire complètement différent et vous perdez toute connaissance, vous construisez à l'aveuglette.

Je pense que c’est un problème dans intellij puisque SceneBuilderS'ATTEND &AGRAVE; CE QUEtrouve votre fichier Java de classe de contrôleur dans (et je cite) "le même répertoire, un sous-répertoire direct ou le répertoire parent du document .fxml".

0
Pedro Borges

J'ai essayé les réponses ci-dessus et cela n'a pas fonctionné dans mon projet. mon projet était avec maven et openjfx dans windows . Ceci a résolu le problème 

fxmlLoader FXMLLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("/main.fxml"));
root = fxmlLoader.load()
0
gigili

J'ai parfois eu la même exception. 

Lorsque je crée un fichier FXML avec le Wizard dans Eclipse, j'écris example.fxml dans le champ du nom. Eclipse crée un fichier, tel que example.fxml.fxml . Avec cette erreur, le FXMLLoader ne peut pas trouver le fichier FXML qui convient ..__ Donc, mon conseil, vérifiez le nom du nom de fichier FXML dans votre méthode de démarrage et le nom réel du fichier.

J'espère pouvoir aider. Bonne chance.

0
budo

J'ai simplement passé au chargeur une URL appropriée comme ceci:

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