JavaFX "emplacement requis."même si elle est dans le même paquet

j'essaye de faire fonctionner mon programme JavaFX mais j'ai quelques difficultés. Je reçois un message d'erreur de java.lang.NullPointerException: Emplacement est nécessaire."Le fichier fxml est dans le même paquet que la classe de la demande. 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 principal.fichier 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 controller existe et se trouve dans le paquet spécifié dans le fichier fxml. Tous mes noms sont corrects et sont là où je pense qu'ils devraient être. Ce qui me manque? J'ai essayé de renommer mon fichier fxml au cas où il y aurait un problème de nom. S'il vous plaît aider. POUR INFO, J'utilise Intellij IDEA sur OSX.

mise à JOUR: C'est un Maven question. J'ai installé Maven pour ce projet et ça a causé le problème. J'ai retiré Maven temporairement pour pouvoir continuer à travailler sans. Quelqu'un a-t-il une idée de la meilleure façon de gérer cela en utilisant Maven?

34
demandé sur Gremash 2013-12-11 03:33:02

14 réponses

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")
55
répondu Amir Arad 2014-08-09 10:02:56

déplacer le fichier dans le répertoire principal/resources a fonctionné.

30
répondu Gremash 2013-12-19 08:47:30
URL url = new File("src/main/java/ua/adeptius/goit/sample.fxml").toURL();
Parent root = FXMLLoader.load(url);

qui est aidé pour moi parce que

getClass.getResource("path")

toujours me renvoie null;

19
répondu Adeptius 2018-04-22 19:27:27

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 FXML de Netbeans Maven juste pour revenir à une sorte de "modèle de référence" quand les choses vont de travers. Pour les tests, 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 ce snippet et que le chargement échoue, vous devriez voir une raison, ou au moins un message du FXMLLoader. Puisque c'est un test, je jette l'exception. Vous ne voulez pas continuer.

choses à noter. C'est un projet maven donc les ressources seront relatives au dossier Ressources, donc:

  • " /FXML/main.fxml".
  • la barre oblique avant est requise.
  • la ressource transmise au 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 passez la question "l'emplacement est requis" , alors vous pouvez avoir un problème dans le FXML

    // quelque Chose comme ceci: // javafx.fxml.LoadException: fichier:/D:/sandbox/javafx/app_examples/personne/cible/personne-00.00.01-INSTANTANÉ.bocal!/fxml / tableWithDetails.fxml: 13

signifie qu'il y a un problème sur Ligne 13 , dans le fichier, par:

  • table withdetails.fxml :13

dans le message. À ce stade, vous devez lire le FXML et voir si vous pouvez repérer le problème. Vous pouvez essayer quelques conseils dans la question connexe.

pour ce problème, mon opinion est que le nom du fichier était cas correct: "Main.fxml". Lorsque le fichier a été déplacé le nom a probablement été changé ou que la chaîne retapé. Bonne chance.

Related:

17
répondu will 2017-05-23 12:26:35

au lieu de

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

mettre

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

la Différence est de " / " .

raison:

1st one : getResource va essayer de trouver la ressource relative au paquet

2nd one: getResource le traitera comme un chemin absolu et appellera simplement le classloader .

5
répondu minigeek 2016-12-29 10:44:18

ce problème peut être causé par un chemin incorrect vers le fichier FXML.

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

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

vous pouvez également utiliser les chemins relatifs:

getClass().getResource("views/view.fxml")
3
répondu gronostaj 2015-07-21 07:53:51

je ne pouvais pas utiliser

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

parce que j'ai mis ma classe de controller dans le paquet "controllers", donc voici ma solution:

getClass().getResource("../views/view.fxml")
3
répondu alexkov 2016-10-06 21:14:36

j'ai eu la même erreur. Dans mon cas, il y avait un symbole d'espace principal dans le nom du fichier fxml:

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

je ne sais pas d'où il vient. Il était très difficile de le remarquer. Quand j'ai enlevé l'espace de tête, tout s'est bien passé. Je ne savais même pas que le nom du fichier pouvait commencer par le symbole spatial.

2
répondu Evaldas Ilginis 2014-06-29 18:06:18

si votre problème n'est pas lié à Maven et que vous obtenez la même "NullPointerException" qui exécute ce programme dans un navigateur (tout en l'exécutant à partir de L'IDE est très bien), essayez ceci:

-> Netbeans -> Cliquez-Droit sur le Projet -> Properties -> Build -> Déploiement -> cochez la Case "Demander un accès sans restriction (Activer la signature, auto-signé)"

ceci est dû à l'Annotation @FXML nécessitant la permission d'injecter valeur du markup FXML (voir http://docs.oracle.com/javafx/2/fxml_get_started/fxml_deployment.htm )

je lançais mon application sur Jdk8u31 et elle ne fonctionnerait jamais sans le certificat dans Chrome / Firefox / IE.

2
répondu mroesler 2015-01-22 06:56:54

le répertoire racine du chargeur se trouve dans le dossier 'resources' pour un projet maven. Donc, si vous avez src/main/java , alors le chemin du fichier fxml devrait commencer par: src/main/resources

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

1
répondu Thomas Bratt 2016-12-30 17:08:10

si votre projet est basé sur Maven Idea ignorera tous les fichiers sauf java dans votre dossier src/main/java. Comme vous l'avez dit, déplacer le fichier vers src/main / resources fonctionne, mais maintenant SceneBuilder ne connaît plus votre classe controller car il est dans un répertoire complètement différent et vous perdez tous les aperçus, vous construisez aveuglément.

je crois que c'est un problème dans intellij depuis SceneBuilder S'attend à pour trouver votre fichier java de classe de contrôleur (et je cite) "le même répertoire, sous-répertoire ou du répertoire parent de la .FXML " document.

0
répondu Pedro Borges 2013-12-27 16:48:47

j'ai parfois eu la même Exception.

quand je crée un fichier FXML avec L'assistant dans Eclipse, j'écris l'exemple .fxml dans le champ nom. Eclipse crée un fichier, comme l'exemple .fxml.fxml . Avec cette erreur, le FXMLLoader ne peut pas trouver le bon fichier FXML. Donc, mon conseil, vérifiez le nom du FXML-Filename dans votre méthode start et le nom réel du fichier.

espère que je peux aider. Bonne chance.

0
répondu budo 2015-11-18 14:08:31

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

load(URL location)

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

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 resources.

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

0
répondu james.garriss 2017-10-10 15:14:23

j'ai simplement passé au chargeur une URL correcte comme celle-ci:

URL url = getClass().getResource("myForm.fxml");
Parent root = FXMLLoader.load(url);
0
répondu Michael Sims 2017-12-02 12:43:46