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 :
Cannot make a static reference to the non-static method setMyContenant(String) from the type ContenantControleur
quand j'essaie de coder :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
application.ContenantControleur.setMyContenant("Bouton contenu poussé");
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?

Voici un code qui illustre le problème.

Contenant.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
 
<?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 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
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 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
 
<?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>
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
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);
 
	    }
 
	}
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
 
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);
	}
}
Merci d'avance pour votre aide