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:

enter image description here

mais j'ai quand même une erreur.

22
demandé sur j will 2013-10-26 08:13:42

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

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

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

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

  1. 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.
  2. placer l'emplacement sur le instanciated FXMLLoader et call load() plutôt que de charger à partir d'un cours d'eau en utilisant load(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.
  3. pour obtenir un emplacement basé sur une catégorie, utilisez getClass().getResource() , comme il est basé sur L'URL, plutôt que getClass().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 .

72
répondu jewelsea 2017-05-23 11:54:43

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") );
4
répondu Dil 2013-10-27 05:37:47

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.

0
répondu Hendrik Ebbers 2013-11-19 09:59:11