Salut à tous,
J'essaie de mettre en place un projet JavaFX qui est buildé par l'intermédiaire de Gradle.
j'essaie d'implémenter le principe d'un controller FXML dédié à ma menuBar qui se chargera LUI de changer le contenu de ma scene ou autres.
J'ai donc pour cela besoin qu'un controller FXML puisse en charger un autre afin d'obtenir le root Node et l'inseré ou je le souhaite.
J'arrive à builder et runner l'application sans problème.
Mais lorsque j'essaie de charger un FXML dans un autre controller FXML c'est toujours une problématique d'url ou de path.
J'essaie à travers ce controller :
de charger le fichier FXML suivant simulationAchat.fxml. J'ai laissé l'ensemble de mes tests visible afin de vous monter toutes mes tentatives infructueuses.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 package compty.controller; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.layout.BorderPane; import java.io.IOException; public class MainScreenController { @FXML private BorderPane borderPane; @FXML private void handleMenuSimulationAchat(ActionEvent event) throws IOException { System.out.println("je suis ici 1"); this.displaySimulationAchatScreen(); } public void displaySimulationAchatScreen() throws IOException { FXMLLoader loader = new FXMLLoader(); loader.setLocation(getClass().getClassLoader().getResource("/compty/views/simulationAchat.fxml")); loader.setLocation(getClass().getClassLoader().getResource("compty/views/simulationAchat.fxml")); loader.setLocation(getClass().getClassLoader().getResource("/views/simulationAchat.fxml")); loader.setLocation(getClass().getClassLoader().getResource("/resources/views/simulationAchat.fxml")); loader.setLocation(getClass().getClassLoader().getResource("resources/views/simulationAchat.fxml")); loader.setLocation(getClass().getClassLoader().getResource("compty/resources/views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("/resources/main/compty/views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("/resources/compty/views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("/resources/simulationAchat.fxml")); loader.setLocation(getClass().getResource("/resources/views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("resources/main/compty/views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("resources/compty/views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("resources/simulationAchat.fxml")); loader.setLocation(getClass().getResource("resources/views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("/compty/views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("/main/compty/views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("/main/views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("/views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("views/simulationAchat.fxml")); loader.setLocation(getClass().getResource("simulationAchat.fxml")); loader.setLocation(getClass().getResource("/simulationAchat.fxml")); Parent root = loader.load(); this.borderPane.setCenter(root); }
Je sais que l'url est chargé à l'éxecution et donc à partir de la structure du Jar et non de mon code source.
Je vous mets l'architecture de mon code source ainsi que de mon Jar compilé.
Néanmoins malgré le fait d'essayer des tas de combinaisons d'URL différentes je n'arrive jamais à charger mon fichier FXML.
D'après la structure de mon code présenté, quel serait d'après vous le bon Path à fournir à la methode getResource() afin d'obtenir ce fameux fichier FXML à travers le FXMLLoader ?
Voici également mon fichier build.gradle :
Et sinon afin de mieux appréhender et comprendre la philosophie de Java pourriez me dire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 plugins { id 'application' id 'org.openjfx.javafxplugin' version '0.0.9' } java { modularity.inferModulePath = true } javafx { version = "14" modules = [ 'javafx.base', 'javafx.controls', 'javafx.fxml' ] } sourceSets { main { resources { srcDirs = ["src/main/java"] includes = ["**/*.fxml"] } } } mainClassName = "compty.Main" repositories { mavenCentral() jcenter() google() // flatDir { // dirs 'bin/commons-io-2.7' // } } dependencies { implementation 'org.apache.commons:commons-csv:1.8' // implementation fileTree("$rootDir/bin/commons-io-2.7/commons-io-2.7.jar") implementation group: 'commons-io', name: 'commons-io', version: '2.8.0' implementation 'org.apache.commons:commons-lang3:3.11' implementation 'org.openjfx:javafx:16-ea+2' }
• La declaration d'un chemin absolue (donc commencant par "/") commence à partir d'ou dans la structure du jar ?
• Pourquoi le contenu de mon dossier src/main/java/compty/views se retrouve dans le JAR dans le dossier resources
• les fichiers FXML doivent obligatoirement être considérés comme des resources ? Moi je préférerais les avoir dans un package de même niveau que controller
• quel serait au final la structure hierarchique de code la plus normé ou conventionnelle pour une application JavaFX ?
Merci de votre précieux éclairage.
Partager