JavaFX Location n’est pas défini message d’erreur

J’ai du mal à essayer de fermer la scène actuelle et d’ouvrir une autre scène lorsque menuItem est sélectionné. Ma scène principale est codée comme suit:

public void start(Stage primaryStage) throws Exception { primaryStage.setTitle("Shop Management"); FXMLLoader myLoader = new FXMLLoader(getClass().getResource("cartHomePage.fxml")); Pane myPane = (Pane) myLoader.load(); CartHomePageUI controller = (CartHomePageUI) myLoader.getController(); controller.setPrevStage(primaryStage); Scene myScene = new Scene(myPane); primaryStage.setScene(myScene); primaryStage.show(); } 

Quand le programme est exécuté, il ira au cartHomePage.fxml. De là, je peux choisir de créer un produit ou de créer une catégorie lorsque l’élément de menu est sélectionné. Voici mon action:

 Stage prevStage; public void setPrevStage(Stage stage){ this.prevStage = stage; } public void gotoCreateCategory(ActionEvent event) throws IOException { Stage stage = new Stage(); stage.setTitle("Shop Management"); FXMLLoader myLoader = new FXMLLoader(getClass().getResource("createCategory.fxml")); Pane myPane = (Pane) myLoader.load(); Scene scene = new Scene(myPane); stage.setScene(scene); prevStage.close(); setPrevStage(stage); stage.show(); } //Method to change scene when menu item create product is on click @FXML public void gotoCreateProduct(ActionEvent event) throws IOException { Stage stage = new Stage(); stage.setTitle("Shop Management"); FXMLLoader myLoader = new FXMLLoader(getClass().getResource("creatProduct.fxml")); Pane myPane = (Pane) myLoader.load(); Scene scene = new Scene(myPane); stage.setScene(scene); prevStage.close(); setPrevStage(stage); stage.show(); } 

Cependant, je ne peux changer de scène qu’une fois. Par exemple, ma page par défaut est cartHomePage.fxml. Lorsque je lance le programme, je commence par créer des produits. Après cela, je ne peux plus aller nulle part. Le message d’erreur est le suivant:

 java.lang.IllegalStateException: Location is not set. and Null Pointer Exception 

Je l’ai mis en scène après l’avoir fermé et passé. Je me demande quelle partie a mal tourné.

Merci d’avance.

J’ai eu ce problème et j’ai trouvé ce post. Mon problème était juste une question de nom de fichier.

 FXMLLoader(getClass().getResource("/com/companyname/reports/" + report.getClass().getCanonicalName().subssortingng(18).replaceAll("Controller", "") + ".fxml")); Parent root = (Parent) loader.load(); 

J’ai un fichier XML qui vient de tout ça et je me suis assuré que ma classe est la même que le fichier fxml moins le mot controller.

J’ai foiré la sous-chaîne pour que le chemin soit incorrect … bien sûr après avoir corrigé le nom du fichier qui fonctionnait.

En bref, je pense que le problème est que le nom du fichier est mal nommé ou que le chemin est incorrect.

AJOUT: J’ai depuis déménagé dans un projet Maven. La manière non Maven est d’avoir tout à l’intérieur de votre projet. La méthode Maven qui était listée dans la réponse ci-dessous était un peu frustrante au début mais j’ai modifié mon code comme suit:

 FXMLLoader loader = new FXMLLoader(ReportMenu.this.getClass().getResource("/fxml/" + report.getClass().getCanonicalName().subssortingng(18).replaceAll("Controller", "") + ".fxml")); 

J’obtenais cette exception et la “solution” que j’ai trouvée était via Netbeans IDE, simplement:

  1. Clic droit -> “Nettoyer et construire”
  2. Exécuter le projet à nouveau

Je ne sais pas pourquoi cela a fonctionné, mais c’est arrivé!

J’ai converti une simple application NetBeans 8 Java FXML en une application pilotée par Maven. Ensuite, j’ai rencontré des problèmes, car les méthodes getResource() n’étaient pas capables de trouver les fichiers .fxml. Dans l’application d’origine de la mine, les fichiers fxml étaient dispersés dans l’arborescence des paquets – chacun à côté de son fichier de classe de contrôleur. Après avoir créé Clean et construit dans NetBeans, j’ai vérifié le résultat .jar dans le dossier cible – le fichier .jar ne contenait aucun fichier fxml. Tous les fxml ont étrangement disparu.

Ensuite, j’ai mis tous les fichiers fxml dans le dossier resources / fxml et défini les parameters de la méthode getResource en conséquence, par exemple: FXMLLoader(App.class.getClassLoader().getResource("fxml/ObjOverview.fxml")); Dans ce cas, tout s’est bien passé. Le dossier fxml est apparu dans la racine de .jar et il contenait tous mes fichiers fxml. Le programme fonctionnait comme prévu.

Je sais que c’est une réponse tardive, mais j’espère aider ceux qui ont ce problème. J’avais la même erreur et j’ai constaté que je devais insérer un / devant mon chemin de fichier. L’appel de fonction corrigé serait alors:

 FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/createCategory.fxml")); // ^ 

J’ai essayé une chose simple et rapide:

J’ai deux paquets -> app.gui et app.login

Dans ma classe de connexion, j’utilise mainview.fxml partir de app.gui donc je l’ai fait dans le login.fxml

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

Et il fonctionne 🙂

Souvent, le chemin de localisation n’est pas correct. Il est important de comprendre que le chemin commence à partir du paquetage actuel dans lequel réside le code et non de la racine du projet. Tant que ce chemin relatif est correct, vous devriez pouvoir éviter cette erreur dans ce cas.

Je pense que le problème est un nom de mise en page incorrect ou un chemin de fichier de mise en page non valide.

pour IntelliJ, vous pouvez créer un répertoire de ressources et y placer des fichiers de mise en page.

 FXMLLoader loader = new FXMLLoader(); loader.setLocation(getClass().getResource("/sample.fxml")); rootLayout = loader.load(); 

J’ai eu le même problème dans mon application JavaFX. Encore plus bizarre: dans mon environnement de développement Windows, tout fonctionnait bien avec le chargeur fxml. Mais quand j’ai exécuté exactement le même code sur ma machine Debian, j’ai eu des erreurs similaires avec “location not set”.

J’ai lu toutes les réponses ici, mais aucune ne semblait vraiment “résoudre” le problème. Ma solution était facile et j’espère que cela aidera certains d’entre vous:

Peut-être que Java est confus, par la méthode getClass () . Si quelque chose s’exécute dans des threads différents ou si votre classe implémente des interfaces, il se peut que la méthode getClass () renvoie une classe différente de la vôtre. Dans ce cas, votre chemin relatif vers creatProduct.fxml sera erroné, car vos “ne sont pas dans le chemin que vous pensez être …”

Donc, pour être du côté de la sauvegarde: soyez plus précis et essayez d’ utiliser le champ de classe statique sur votre classe ( notez YourClassHere.class ).

 @FXML public void gotoCreateProduct(ActionEvent event) throws IOException { Stage stage = new Stage(); stage.setTitle("Shop Management"); FXMLLoader myLoader = new FXMLLoader(YourClassHere.class.getResource("creatProduct.fxml")); Pane myPane = (Pane) myLoader.load(); Scene scene = new Scene(myPane); stage.setScene(scene); prevStage.close(); setPrevStage(stage); stage.show(); } 

Après avoir réalisé cela, je le ferai TOUJOURS comme ça. J’espère que cela pourra aider!

La réponse ci-dessous de CsPeitch et des autres est sur la bonne voie. Assurez-vous simplement que le fichier fxml est copié sur la cible de sortie de votre classe ou que le moteur d’exécution ne le verra pas. Vérifiez le répertoire du fichier de classe généré et voyez si le fichier fxml est là

Je veux dire quelque chose comme ça:

 FXMLLoader myLoader = null; Scene myScene = null; Stage prevStage = null; public void start(Stage primaryStage) throws Exception { primaryStage.setTitle("Shop Management"); myLoader = new FXMLLoader(getClass().getResource("cartHomePage.fxml")); Pane myPane = (Pane) myLoader.load(); CartHomePageUI controller = (CartHomePageUI) myLoader.getController(); controller.setPrevStage(primaryStage); myScene = new Scene(myPane); primaryStage.setScene(myScene); primaryStage.show(); } 

Après ça

 public void setPrevStage(Stage stage){ this.prevStage = stage; } public void gotoCreateCategory(ActionEvent event) throws IOException { Stage stage = new Stage(); stage.setTitle("Shop Management"); myLoader = new FXMLLoader(getClass().getResource("createCategory.fxml")); Pane myPane = (Pane) myLoader.load(); Scene scene = new Scene(myPane); stage.setScene(scene); // prevStage.close(); I don't think you need this, closing it will set preStage to null put a breakpoint after this to confirm it setPrevStage(stage); stage.show(); } //Method to change scene when menu item create product is on click @FXML public void gotoCreateProduct(ActionEvent event) throws IOException { Stage stage = new Stage(); stage.setTitle("Shop Management"); myLoader = new FXMLLoader(getClass().getResource("creatProduct.fxml")); Pane myPane = (Pane) myLoader.load(); Scene scene = new Scene(myPane); stage.setScene(scene); // prevStage.close(); I don't think you need this, closing it will set preStage to null put a breakpoint after this to confirm it setPrevStage(stage); stage.show(); } 

Essayez-le et faites le moi savoir s’il vous plaît.

Cela m’est arrivé et j’ai trouvé la solution. Si vous construisez votre projet avec vos fichiers .fxml dans différents packages de la classe qui a la ligne de lancement ( Parent root = FXMLLoader.load(getClass().getResource("filenamehere.fxml")); ) et utilisez un chemin relatif Windows excepté le premier ne lancera pas quand vous courez le pot. Pour restr bref, placez le fichier .fxml dans le même package que la classe qui le lance et définissez le chemin comme ceci (“filenamehere.fxml”) et cela devrait fonctionner correctement.

J’ai eu le même problème.

Après quelques minutes, je me suis rendu compte que j’essayais de charger le fichier.fxml à partir d’un mauvais emplacement.

 FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/[wrong-path]/abc.fxml")); fxmlLoader.setClassLoader(getClass().getClassLoader()); fxmlLoader.setRoot(this); fxmlLoader.setController(this); fxmlLoader.load(); 

Je suis tombé sur le même problème. Le programme fonctionnait très bien à partir d’Eclipse via le bouton “Exécuter”, mais PAS à partir d’un fichier JAR exécutable auparavant. Ma solution était:

1) Déplacer la classe principale dans le package par défaut

2) Définissez un autre chemin pour Eclipse, et d’autres lors de l’exécution à partir du fichier JAR (collez-le dans Main.java )

 public static final Ssortingng sourcePath = isProgramRunnedFromJar() ? "src/" : ""; public static boolean isProgramRunnedFromJar() { File x = getCurrentJarFileLocation(); if(x.getAbsolutePath().contains("target"+File.separator+"classes")){ return false; } else { return true; } } public static File getCurrentJarFileLocation() { try { return new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); } catch(URISyntaxException e){ e.printStackTrace(); return null; } } 

Et après cela, dans la méthode de démarrage , vous devez charger des fichiers comme ceci:

 FXMLLoader loader = new FXMLLoader(getClass().getResource(sourcePath +"MainScene.fxml")); 

Il fonctionne pour moi dans Eclipse Mars avec le plug- in e (fx) clipse .

Pour les utilisateurs d’Intellij, mon problème était que le répertoire où se trouvaient mes fichiers fxml (src / main / resources) n’était pas marqué comme un répertoire “Ressources”.

Ouvrez les parameters du module / projet, accédez à l’onglet sources et vérifiez qu’Intellij sait que le répertoire contient les fichiers de ressources du projet.

le mien était étrange … IntelliJ spécifique bizarrerie.

J’ai regardé mes classes de sortie et il y avait un dossier:

xyz

au lieu de

x / y / z

mais si vous avez certaines options définies dans IntelliJ, dans le navigateur, ils ressembleront tous deux à xyz

alors vérifiez votre dossier de sortie si vous vous grattez la tête

J’ai eu le même problème. C’est un problème simple de ne pas spécifier le bon chemin.

Faites un clic droit sur le fichier .fxml et sélectionnez les propriétés (pour ceux qui utilisent eclipse, cela ne différera pas autant pour un autre IDE), puis copiez la copie à partir de /packagename jusqu’à la fin, ce qui résoudra le problème

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

dans mon cas je viens de retirer ..

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