web-dev-qa-db-fra.com

Comment référencer des fichiers javafx fxml dans un dossier de ressources?

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:

enter image description here

mais j'ai toujours une erreur.

24
j will

Exemple d'utilisation

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load(); 

Options de résolution d'emplacement

  1. Placez tout votre fxml dans le répertoire src/main/resources.

    loader.setLocation(getClass().getResource("/main.fxml"));
    
  2. Placez tout votre fxml dans un répertoire src/main/resources/fxml. 

    loader.setLocation(getClass().getResource("/fxml/main.fxml"));
    
  3. 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

  1. Instanciez un FXMLLoader via new FXMLLoader() au lieu d'utiliser The méthodes statiques sur le FXMLLoader

    • Les méthodes statiques Deviennent déroutantes lorsque vous voulez obtenir des valeurs (comme des contrôleurs instanciés ) Hors d'un chargeur.
  2. Définissez l'emplacement sur le FXMLLoader instancié et appelez load() plutôt que de charger à partir d'un flux en utilisant load(stream) .

    • La définition d'un emplacement basé sur une URL sur le chargeur permet la résolution des ressources relatives Chargées dans les fichiers fxml et css. Les ressources relatives Ne sont pas résolues pour un constructeur basé sur un flux.
  3. 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 .

78
jewelsea

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") );
4
Dil

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.

0
Hendrik Ebbers