Comment référencer les fichiers javafx fxml dans le dossier ressource?
je crée une application GUI javafx et mon projet est un projet configuré maven. Je veux pouvoir référencer mes fichiers fxml comme ceci dans Mes controllers:
FXMLLoader.load(getClass().getResource("main.fxml");
Où est ma main.le fichier fxml est situé dans le dossier src/main/resources et mon contrôleur est dans le dossier src/main/java. Comment dois-je faire? Mon dossier src/main/resources est dans le chemin de compilation et je peux appeler A.fichier de propriétés qui se trouve dans le dossier src/main/resources d'une classe dans le dossier src/main/java.
Modifier
j'ai essayé de placer le fichier fxml dans le répertoire correspondant du dossier main resources:
mais j'ai quand même une erreur.
3 réponses
exemple d'usage
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load();
Emplacement des options de résolution
-
mettez tout votre fxml dans le répertoire src/main/resources.
loader.setLocation(getClass().getResource("/main.fxml"));
-
mettez tout votre FXML dans un répertoire src/main/resources/fxml.
loader.setLocation(getClass().getResource("/fxml/main.fxml"));
-
Place 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 des sources Java correspondante. Par exemple, vous pouvez invoquer la dernière commande load de la source com.mycompany.myapp.Main.java
.
recommandations D'utilisation de FXMLLoader
-
Instantiate an Fxmllloader via
new FXMLLoader()
plutôt que d'utiliser les méthodes statiques sur le FXMLLoader .- les méthodes statiques devenir déroutant lorsque vous voulez obtenir des valeurs (comme instantiated les contrôleurs) d'un chargeur.
-
placer l'emplacement sur le instanciated FXMLLoader et call
load()
plutôt que de charger à partir d'un cours d'eau en utilisantload(stream)
.- définir un emplacement basé sur L'URL sur le chargeur permet une résolution de ressources relatives chargées dans les fichiers fxml et css. Relatif les ressources ne se résolvent pas pour un constructeur basé sur stream.
-
pour obtenir un emplacement basé sur une catégorie, utilisez
getClass().getResource()
, comme il est basé sur L'URL, plutôt quegetClass().getResourceAsStream()
qui est basé sur les flux.
IDE et les Paramètres de construction de la
assurez-vous que votre outil IDE ou build copie les fichiers fxml à partir du répertoire de ressources vers le répertoire de sortie de build. Pour comprendre les paramètres Intellij pour cela, voir: comment convertir un projet java normal à intellij dans un projet JavaFx .
vous utilisez FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("main.fxml") );
pour charger votre main.fxml. Cela nécessite le main.FXML et la classe java le chargeant dans le même répertoire/chemin.
Si vous voulez charger un fichier fxml à partir d'un chemin/emplacement différent de la classe java qui le charge, vous devez utiliser le chemin relatif.
Comme @jewelsea mentionné ci-dessus, vous pouvez utiliser le chemin relatif en utilisant / caractère avant votre main.fxml.
Donc le code qui vous permettra de le faire fonctionner 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 "dominion.dossier" Application "au lieu d'un dossier" application "à l'intérieur d'un dossier" dominion". Pour cette raison, la classe" MainController " est placée dans un paquet différent du fichier fxml.