comment récupérer l'instance du controleur qui a été créée lors du chargement de mon FXML
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 :
Citation:
Cannot make a static reference to the non-static method setMyContenant(String) from the type ContenantControleur
quand j'essaie de coder :
Code:
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:
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:
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:
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:
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:
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