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?
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")
déplacer le fichier dans le répertoire principal/resources a fonctionné.
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;
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:
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 .
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")
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")
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.
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.
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
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.
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.
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
j'ai simplement passé au chargeur une URL correcte comme celle-ci:
URL url = getClass().getResource("myForm.fxml");
Parent root = FXMLLoader.load(url);