IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Ajouter du contenu dans le contenu existant d'une autre fenêtre


Sujet :

JavaFX

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 32
    Points
    32
    Par défaut Ajouter du contenu dans le contenu existant d'une autre fenêtre
    Bonjour.

    La première fenêtre contient une VBox avec un SplitPane et un menu qui affiche le contenu de cette fenêtre depuis une classe java (nommée CreationTest). Son code fxml est:
    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
    <VBox 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.29" focusTraversable="true" prefHeight="160.0" prefWidth="200.0" xmlns:fx="http://javafx.com/fxml">
      <items>
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
    <children><Text strokeType="OUTSIDE" strokeWidth="0.0" text="Bonjour" />
    </children></AnchorPane>
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0" />
      </items>
    </SplitPane>
    </children></VBox>
    Le code du controller de la première fenêtre est:
    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
    public class OneController {
    private CreationTest creatTest;
    public CreationTest getcreat() {
        	if(creatTest== null)
        		creatTest= new CreationTest();
    		return creatTest;
    	}
    @FXML private VBox vboxPane;
    	 @FXML protected void onLoad(ActionEvent actionEvent) {
    			try {
    vboxPane.getChildren().add(getcreat().TestPane());
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
                 }	
    }
    Le code de la classe java de contenu est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public final class CreationTest {
     public BorderPane TestPane() throws Exception{
            final Pane onePane = new Pane();
            final BorderPane sceneRoot = FXMLLoader.load(getClass().getResource("Padevide.fxml"));
            sceneRoot.setCenter(onePane);
    		return sceneRoot;
        }
    La deuxième fenêtre contient un GridPane avec un bouton. Quand on clique sur le bouton, cela doit charger un contenu additionnel dans le contenu existant (pour l'enrichir) de la première fenêtre (qui lui provient à l'origine de la classe java de contenu). Son code fxml est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <GridPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="TwoController">
    <children><Label text="Cliquer sur le bouton" /><Button mnemonicParsing="false" text="Valider" GridPane.columnIndex="1" onAction="#onAddContent" />
    </children></GridPane>
    Comment faire?
    Que mettre dans la méthode onAddContent du controller TwoController?

    Je vous remercie.

  2. #2
    Membre chevronné
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 545
    Points : 2 084
    Points
    2 084
    Par défaut
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

    Code Java : 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
    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é

    Code FXML : 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
    <?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
    Code Java : 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
    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:

    Code FXML : 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
     
    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

    Code Java : 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
     
    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);
        }
     
    }

Discussions similaires

  1. [debutant] Ajout des Composants dans le contenu de la Fênetre.
    Par cherche_java dans le forum Débuter
    Réponses: 2
    Dernier message: 28/02/2015, 10h06
  2. [Débutant] ajouter un controle dans un panel contenu dans une autre fenêtre
    Par veens777 dans le forum VB.NET
    Réponses: 4
    Dernier message: 24/08/2012, 18h01
  3. Réponses: 6
    Dernier message: 14/06/2010, 14h55
  4. Réponses: 4
    Dernier message: 20/07/2006, 10h35
  5. Ajouter du texte dans un input à partir d'une autre fenêtre
    Par Michaël dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/04/2005, 20h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo