Je suis désolé mais tu as tout mélangé dans tes codes. Premier erreur :tu veux créer une manière de faire un load du fichier fxml dans le contrôleur dont il fait référence
Le premier fichier fxml fait référence déjà à OneController, alors c'est fini il contrôle tout le contenu qui est dans le fichier FXML, JavaFX fait le reste pour vous, le fait que tu signale seulement fx:controller="OneController", ça suffit, tu n'a pas besoin de venir créer un VBox dans la classe OneController pour faire un load. Si tu veux manipuler des objet qui sont dans le ficher fxml, alors l'annotation @FXML private ClasseType fxid, ça suffit.
Vu que lors du chargement du fichier les objets qui sont dans le fichier fxml sont crées alors l'annotation @FXML et l'ID(fx:id) nous retourne une référence vers l'objet qu'on veut qui est dans le fichier, ce n'est pas nous qui allons instancier.
En plus, tes controlleurs n’implémentent pas l'interface Initializable qui permet d’implémenter la méthode public void initialize(URL url, ResourceBundle rb), ce n'est pas obligatoire de l’implémenter mais si tu as des actions à exécuter le moment que le fichier est déjà chargé comment tu va faire alors que tu n'a pas de constructeur?
La 2ème erreur c'est que dans classe CreationTest tu fais
final BorderPane sceneRoot = FXMLLoader.load(getClass().getResource("Padevide.fxml"))
alors que le noeud racine de ton fichier fxml est un Vbox comment veut tu insérer un VBox dans un BorderPane
La 3e erreur tu crée un Pane vide et tu le place au centre du BorderPane et après tu retourne
J'ai essayé d'arranger un peu les choses pour éviter ces bug dans les sources, j'ai ajouter des choses alors je vais expliquer pourquoi et le code est là.
Alors revenons sur la problématique posée. Déjà où est le contenu additionnel que tu veux ajouter au premier fenêtre?
Car si j'ai bien compris ce que tu dis le 2e fichier fxml est inséré dans une autre fenêtre, un dialogue? d'où un Stage à part ou quoi? Mais en réanalysant bien ton fichier FXML je vois que tu met une action dans MenuItem qui pointe sur l'action onLoad, ça sous-entend que tu veux cliquer pour ouvrir quelque chose à être affiché.
Alors en attendant ta réaction, je vais essayer de supposer que tu veux ouvrir un dialogue qui va contenir le contenu du 2e fichier fxml et cliquer sur le bouton pour que le contenu s'ajoute au 2e paneau du SplitPane existant dans la première fenêtre.
Alors je vais expliquer une des solution pour aboutir à ce que tu veux, tu dois avoir dans ton TwoController une variable de type OneController, qui va avoir une référence de OneController qui gère le premier fichier fxml.
Mais pour passer cette reference on pourrait la stocké quelque part dans CreationTest, mais on va supposer que la méthode qui va ouvrir le contenu du 2e fichier, se trouve dans la calsse TwoController donc avec "this" on peut le passer au 2e contrôleur. Alors pour récupérer le 2e contrôleur dans la classe OneControler afin de lui passer "this"(en supposant qu'on a crée un getter dans TwoController qui a besoin de OneController dans ses paramètres), pour récupérer un contrôleur, d'abord lors du chargement du fichier fxml, on ne fait pas comme tu fais en chargeant directement le fichier fxml en appelant la méthode statique load de la classe FXMLLoader, mais on utilise la 2e méthode, il faut créer d'abord un objet de type FXMLLoader et puis charger en ouvrant un flux vers le fichier fxml et tu peux après avec cet objet récupérer la référence du contrôleur qui est aussi instancié directement après le chargement du fichier fxml.
Ainsi, une fois le contrôleur récupéré, on lui passe la référence de OneController car tous les objet qui sont dans le premier fichier fxml on en a pas accès qu'à travers OneController, or on veut manipuler le 2e panneau du premier fichier fxml pour ajouter du contenu. Alors d'abord j'ai ajouté un fx:id au 2e AnchorPane afin de de référencer dans le contrôleur avec l'annotation FXML et puis après TwoContoller une fois il a la référence de OneController, il pourra ajouter quelque chose dans ce AnchorPane. Voici les codes, même ton fichier Fxml avait une erreur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import javafx.fxml.FXMLLoader;import javafx.scene.layout.VBox;
import javafx.scene.layout.BorderPane;
public final class CreationTest {
public BorderPane TestPane() throws Exception{
BorderPane sceneRoot=new BorderPane();
final VBox vboxPane = FXMLLoader.load(getClass().getResource("Padevide.fxml"));
sceneRoot.setCenter(vboxPane);
return sceneRoot;
}
} |
Le premier fichier fxml corrigé
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
| <?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<VBox prefHeight="288.0" prefWidth="392.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="OneController">
<children>
<MenuBar xmlns:fx="http://javafx.com/fxml">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" onAction="#onLoad" text="Open" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Edit">
<items>
<MenuItem mnemonicParsing="false" text="Delete" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar><SplitPane dividerPositions="0.34102564102564104" focusTraversable="true" prefHeight="260.0" prefWidth="392.0">
<items>
<AnchorPane fx:id="premierpaneau" minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
<children><Text layoutX="35.63525390625" layoutY="61.5" strokeType="OUTSIDE" strokeWidth="0.0" text="Bonjour" />
</children></AnchorPane>
<AnchorPane fx:id="deusiemepaneau" minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0" />
</items>
</SplitPane>
</children></VBox> |
La classe OneController
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 55 56 57 58 59 60 61 62 63 64 65 66
|
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class OneController implements Initializable{
@FXML
private AnchorPane premierpaneau;
@FXML
private AnchorPane deusiemepaneau;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
@FXML protected void onLoad(ActionEvent actionEvent) {
try {
FXMLLoader chargeurFXML = new FXMLLoader();
GridPane gridp=chargeurFXML.load(getClass().getResource("fichierfxml2.fxml").openStream());
//On recupère le controleur du 2e fichier pour lui fournir la référence du controlleur en cours, cette classe même
TwoController referenceDeusiemeCtrl=(TwoController)chargeurFXML.getController();
referenceDeusiemeCtrl.setPremierControleur(this);
Scene peitscene=new Scene(gridp);
Stage dialogue=new Stage();
dialogue.setScene(peitscene);
dialogue.show();
} catch (IOException ex) {
Logger.getLogger(OneController.class.getName()).log(Level.SEVERE, null, ex);
}
}
public AnchorPane getDeusiemepaneau() {
return this.deusiemepaneau;
}
} |
La classe TwoController:
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
|
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 javafx.scene.layout.AnchorPane;
import javafx.scene.text.Text;
/**
* FXML Controller class
*
* @author bilalsoidik
*/
public class TwoController implements Initializable {
private OneController premierControleur;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
public void setPremierControleur(OneController premierControleur) {
this.premierControleur = premierControleur;
}
@FXML protected void onAddContent(ActionEvent actionEvent) {
AnchorPane deusiemepneau = this.premierControleur.getDeusiemepaneau();
deusiemepneau.getChildren().add(new Label("Je suis un contenu additionnel ajouté au premier fênetre"));
}
} |
Je n'ai pas modifié le 2e fichier FXML je l'ai juste nommé fichierfxml2.fxml, et j'ai testé avec la calsse Main suivante quand ça s'execute, je clique sour le menu File, et puis Open, le dialogue s'ouvre, je clique sur le bouton, un label s'ajoute au premier fenêtre dans le 2e panneau à droite du SplitPane
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
|
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
*
* @author bilalsoidik
*/
public class Main extends Application {
@Override
public void start(Stage stage) throws Exception {
CreationTest cr=new CreationTest();
Parent root = cr.TestPane();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* The main() method is ignored in correctly deployed JavaFX application.
* main() serves only as fallback in case the application can not be
* launched through deployment artifacts, e.g., in IDEs with limited FX
* support. NetBeans ignores main().
*
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
} |
Partager