J'ai un problème en essayant 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();
}
Lorsque le programme est exécuté, il ira à la cartHomePage.fxml. De là, je peux choisir d'aller créer un produit ou créer une catégorie lorsque l'élément de menu est sélectionné. Voici mon événement d'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 seule fois. Par exemple, ma page par défaut est cartHomePage.fxml. Lorsque je lance le programme, je commence par créer l'étape du produit. Après cela, je ne peux plus aller nulle part. Le message d'erreur est:
Java.lang.IllegalStateException: Location is not set.
and Null Pointer Exception
J'ai préparé le décor après l'avoir fermé et le faire circuler. Je me demande quelle partie a mal tourné.
Merci d'avance.
J'ai eu ce problème et trouvé ce post. Mon problème était juste un problème de nom de fichier.
FXMLLoader(getClass().getResource("/com/companyname/reports/" +
report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") +
".fxml"));
Parent root = (Parent) loader.load();
J'ai un fichier XML dont tout cela provient et je me suis assuré que ma classe est identique au fichier fxml moins le contrôleur Word.
J'ai foiré la sous-chaîne, donc le chemin était mauvais ... bien sûr, après avoir corrigé le nom du fichier, cela a fonctionné.
Pour résumer, je pense que le problème est que le nom du fichier est mal nommé ou que le chemin est incorrect.
ADDITION: Depuis, je suis passé à un projet Maven. La méthode non Maven consiste à tout avoir dans votre chemin de projet. La manière Maven qui était énumérée dans la réponse ci-dessous était un peu frustrante au début, mais j'ai apporté une modification à mon code comme suit:
FXMLLoader loader = new FXMLLoader(ReportMenu.this.getClass().getResource("/fxml/" + report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") + ".fxml"));
Je recevais cette exception et la "solution" que j'ai trouvée passait par l'EDI Netbeans, simplement:
Je ne sais pasPOURQUOIcela a fonctionné, mais ça a fonctionné!
J'ai converti une simple application NetBeans 8 Java FXML en une application pilotée par Maven. Ensuite, j'ai eu des problèmes, parce que les méthodes getResource()
n'étaient pas capables de trouver les fichiers .fxml. Dans la version originale de mon application, les fichiers XML étaient disséminés dans l’arbre des paquets, chacun à côté de son fichier de classe de contrôleur. Après le nettoyage et la construction de NetBeans, j’ai vérifié le résultat .jar dans le dossier cible: le fichier .jar ne contenait aucun fichier fxml. Tous les fxmls ont étrangement disparu.
Ensuite, je mets tous les fichiers xml dans le dossier resources/fxml et je règle les paramètres 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 à la racine du fichier .jar et contenait tous mes fxml. Le programme fonctionnait comme prévu.
Je sais que c'est une réponse tardive, mais j'espère pouvoir aider tous ceux qui ont ce problème. J'obtenais la même erreur et j'ai constaté que je devais insérer un /
devant le chemin de mon 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 le mainview.fxml
de app.gui
alors je l'ai fait dans le login.fxml
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../gui/MainView.fxml"));
Et il fonctionne :)
Je pense que le problème est soit un nom de structure incorrect, soit un chemin de fichier de configuration non valide.
pour IntelliJ, vous pouvez créer un répertoire de ressources et y placer des fichiers de présentation.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample.fxml"));
rootLayout = loader.load();
Il arrive souvent que le chemin d’emplacement ne soit pas correct. Il est important de réaliser que le chemin d'accès part du package actuel dans lequel réside le code et non de la racine du projet. Tant que vous obtenez ce chemin relatif correct, vous devriez pouvoir éviter cette erreur dans ce cas.
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 lorsque j'ai exécuté exactement le même code sur ma maschine Debian, des erreurs similaires se sont produites 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 simple et j'espère que cela aidera certains d'entre vous:
Peut-être que Java est dérouté par la méthode getClass () . Si quelque chose fonctionne dans des threads différents ou si votre classe implémente des interfaces, il est évident qu'une classe différente de la vôtre est renvoyée par la méthode getClass (). Dans ce cas, votre chemin relatif vers creatProduct.fxml sera faux, 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 utilisez le champ de classe statique de votre classe (Notez le 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!
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/Main.fxml"));
dans mon cas je retire juste ..
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/Main.fxml"));
Pour les utilisateurs d’Intellij, le problème était que le répertoire dans lequel j’avais mes fichiers fxml (src/main/resources) n’était pas marqué en tant que répertoire "Resources".
Ouvrez les paramètres du module/projet, allez sur l'onglet sources et assurez-vous qu'Intellij sait que le répertoire contient les fichiers de ressources du projet.
La réponse ci-dessous de CsPeitch et d’autres est sur la bonne voie. Assurez-vous simplement que le fichier fxml est copié sur la cible de sortie de votre classe, sinon 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 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 laissez-moi savoir s'il vous plaît.
le mien était étrange ... bizarre spécifique à IntelliJ.
J'ai regardé mes classes de sortie et il y avait un dossier:
x.y.z
au lieu de
x/y/z
mais si vous avez certaines options définies dans IntelliJ, dans le navigateur, elles ressembleront à x.y.z
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 simple problème de ne pas spécifier le bon chemin.
Faites un clic droit sur le sur votre fichier .fxml
et sélectionnez les propriétés (pour ceux qui utilisent Eclipse ne différera pas tant pour un autre IDE), puis copiez la copie de l'emplacement à partir de /packagename
jusqu'à la fin et cela devrait résoudre le problème
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 du fichier JAR exécutable que j’avais exporté auparavant ..____.
1) Déplacez Main class dans le package par défaut
2) Définissez un autre chemin pour Eclipse et un autre lors de l’exécution à partir du fichier JAR (coller ceci dans Main.Java )
public static final String 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 ensuite, dans start method, vous devez charger des fichiers comme celui-ci:
FXMLLoader loader = new FXMLLoader(getClass().getResource(sourcePath +"MainScene.fxml"));
Cela fonctionne pour moi dans Eclipse Mars avec e (fx) clipse plugin.
J'ai eu le même problème.
après quelques minutes, je me suis dit 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();
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 ayant la ligne de lancement (Parent root = FXMLLoader.load(getClass().getResource("filenamehere.fxml"));
) , Utilisez un chemin relatif. Vos fenêtres, à l’exception de la première, ne se lanceront pas lors de l’exécution du fichier jar. Pour le garder court, placez le fichier .fxml dans le même paquet que la classe qui le lance et définissez le chemin comme ceci ("nomfichier.fxml") et tout devrait fonctionner correctement.