Bonjour,
J'ai un FXML "Contenant.fxml" qui contient un label, un bouton et un include d'un "Contenu.fxml" qui contient lui même un bouton et un label.
Les deux FXML ont leur propre controleur.
Je voudrais pouvoir accéder à partir de mon controleur "Contenu" à une méthode public de mon controleur "Contenant".
Je reçois le message suivant :
quand j'essaie de coder :Cannot make a static reference to the non-static method setMyContenant(String) from the type ContenantControleur
et je comprends bien ce message. Ma question est donc comment récupérer l'instance du controleur qui a été crée lors du chargement de mon FXML?
Code : Sélectionner tout - Visualiser dans une fenêtre à part application.ContenantControleur.setMyContenant("Bouton contenu poussé");
Voici un code qui illustre le problème.
Contenant.fxml:
et son controlleur
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 <?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.layout.AnchorPane?> <AnchorPane prefHeight="400.0" prefWidth="400.0" style="-fx-background-color: red;" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.ContenantControleur"> <children> <fx:include fx:id="includedContenu" layoutX="100.0" layoutY="100.0" source="Contenu.fxml" /> <Label fx:id="lblContenant" layoutX="5.0" layoutY="10.0" text="Ceci est le contenant" /> <Button layoutX="300.0" layoutY="350.0" mnemonicParsing="false" onAction="#handleButtonContenant" text="BtnContenant" /> </children> </AnchorPane>
et le Contenu.fxml
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 package application; import java.net.URL; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Label; import application.ContenuControleur; public class ContenantControleur implements Initializable { @FXML private Label lblContenant; @FXML private ContenuControleur includedContenuController; @FXML private void handleButtonContenant(ActionEvent event) { System.out.println("You clicked Contenant Button!"); setMyContenant("Bouton contenant poussé"); //application.ContenuControleur.setMyContenu("Bouton contenant poussé"); } @Override public void initialize(URL url, ResourceBundle rb) { // TODO } public void setMyContenant(String texteContenant){ lblContenant.setText(texteContenant); } }
et son contrôleur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.layout.AnchorPane?> <AnchorPane prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: yellow" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.ContenuControleur"> <children> <Label fx:id="lblContenu" layoutX="5.0" layoutY="20.0" text="Ceci est le contenu" /> <Button layoutX="105.0" layoutY="170.0" mnemonicParsing="false" onAction="#handleButtonContenu" text="BtnContenu" /> </children> </AnchorPane>
enfin, mon Main.java
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 package application; import java.net.URL; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Label; public class ContenuControleur implements Initializable { @FXML private Label lblContenu; @FXML private void handleButtonContenu(ActionEvent event) { System.out.println("You clicked Contenu Button!"); setMyContenu("Bouton contenu poussé"); //application.ContenantControleur.setMyContenant("Bouton contenu poussé"); // j'ai avec l'instruction précédente un message : Cannot make a static reference to the non-static method setMyContenant(String) from the type ContenantControleur } @Override public void initialize(URL url, ResourceBundle rb) { // TODO } public void setMyContenu(String texteContenu){ lblContenu.setText(texteContenu); } }
Merci d'avance pour votre aide
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 package application; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.stage.Stage; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.BorderPane; public class Main extends Application { @Override public void start(Stage primaryStage) { try { AnchorPane root = new AnchorPane(); root = FXMLLoader.load(getClass().getResource("Contenant.fxml")); Scene scene = new Scene(root,400,400); scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage.setScene(scene); primaryStage.show(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); } }
Partager