Je crée une application d'interface graphique javafx et mon projet est un projet configuré par maven. Je veux pouvoir référencer mes fichiers fxml comme ceci dans mes contrôleurs:
FXMLLoader.load(getClass().getResource("main.fxml");
Où mon fichier main.fxml se trouve dans le dossier src/main/resources et mon contrôleur dans le dossier src/main/Java. Comment puis-je faire cela? Mon dossier src/main/resources est dans le chemin de construction et je peux appeler un fichier .properties situé dans le dossier src/main/resources à partir d'une classe du dossier src/main/Java.
Modifier
J'ai essayé de placer le fichier fxml dans le répertoire correspondant du dossier principal des ressources:
mais j'ai toujours une erreur.
Exemple d'utilisation
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load();
Options de résolution d'emplacement
Placez tout votre fxml dans le répertoire src/main/resources.
loader.setLocation(getClass().getResource("/main.fxml"));
Placez tout votre fxml dans un répertoire src/main/resources/fxml.
loader.setLocation(getClass().getResource("/fxml/main.fxml"));
Placez fxml dans un répertoire de ressources correspondant; par exemple. src/main/resources/com/mycompany/myapp.
loader.setLocation(getClass().getResource("main.fxml"));
La dernière option suppose que la classe à partir de laquelle vous chargez le fxml se trouve au même emplacement relatif dans la hiérarchie de source Java correspondante. Par exemple, vous pouvez appeler la dernière commande de chargement à partir de la source com.mycompany.myapp.Main.Java
.
Recommandations d'utilisation FXMLLoader
Instanciez un FXMLLoader via new FXMLLoader()
au lieu d'utiliser The méthodes statiques sur le FXMLLoader .
Définissez l'emplacement sur le FXMLLoader instancié et appelez load()
plutôt que de charger à partir d'un flux en utilisant load(stream)
.
Pour dériver un emplacement basé sur une classe, utilisez getClass().getResource()
, car il s'agit d'une URL, plutôt que getClass().getResourceAsStream()
qui est basé sur un flux.
IDE et paramètres de construction
Assurez-vous que votre IDE ou outil de génération copie les fichiers fxml du répertoire de ressources dans le répertoire de sortie de la génération. Pour comprendre les paramètres Intellij, reportez-vous à la section suivante: Comment convertir un projet Java normal dans intellij en projet JavaFx .
Vous utilisez FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("main.fxml") );
pour charger votre fichier main.fxml. Cela nécessite le fichier main.fxml et la classe Java qui le charge dans le même répertoire/chemin . Si vous souhaitez charger un fichier fxml à partir d'un chemin/emplacement différent de la classe Java qui le charge, vous devez utiliser un chemin relatif .. Comme @jewelsea mentionné ci-dessus, vous pouvez utiliser le chemin relatif en utilisant/caractère avant votre fichier main.fxml . Ainsi, le code qui le fera fonctionner pour vous dans votre cas est
FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("/main.fxml") );
Ouvrez votre dossier de ressources dans l'explorateur de fichiers de votre système d'exploitation. Ici, vous verrez que vous avez créé un dossier "dominion.application" au lieu d'un dossier "application" dans un dossier "dominion". Pour cette raison, la classe "MainController" est placée dans un package différent en tant que fichier fxml.