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 :

Communication entre 2 contrôleurs liés chacun à un fichier fxml


Sujet :

JavaFX

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Par défaut Communication entre 2 contrôleurs liés chacun à un fichier fxml
    Bonjour, situons mon problème.

    J'ai une fenêtre principale dans laquelle j'ai une TableView de deux colonnes, un Label pour afficher qu'un ajout vient d'être fait, un Button qui permet d'ouvrir une boîte de dialogue.
    Cette boîte de dialogue contient 2 TextField et un Button.

    Ce que je cherche à faire : lorsque je clique sur le bouton "ajouter" de ma boîte de dialogue, je veux ajouter dans la table de ma fenêtre principale les valeurs de deux champs de ma boîte de dialogue et en plus mofifier le label de ma fenêtre principale pour informer d'un ajout dans la table.

    J'ai fait un simple programme pour illustrer mon problème. Le code fournit fonctionne pour afficher la fenêtre principale et afficher la boîte de dialogue suite au clic du bouton de la fenêtre principale. Il ne permet pas d'ajouter des informations dans la table ni de mettre à jours le label.

    On comprend bien ici qu'il faut trouver un moyen de communiquer entre ces deux fenêtres en sachant que chaque fenêtre a une classe "controller" propre et un fichier fxml propre.

    J'ai voulu essayer de créer un objet de type "DialogController" dans ma classe "MainWindowController" en passant en paramètre "this" pour pouvoir communiquer entre les deux objets. Cela ne fonctionne pas et je dois avouer que je ne sais pas vraiment pourquoi.

    J'ai aussi essayé d'autres choses qui tiennent plus d'un bricolage bancale que de quelque chose de propre.

    Je met le code exemple à disposition. Ce que j'ai essayé de faire est en commentaire sous la forme /**/. Je n'ai pas commenté le reste du code car il est très simple et les noms de variables sont parlants.

    Fichier principal.
    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
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.AnchorPane;
    import javafx.stage.Stage;
     
    public class MyApp extends Application{
     
        public static void main(String[] args){
            Application.launch(MyApp.class, (java.lang.String[]) null);
        }
     
        @Override
        public void start(Stage primaryStage) throws Exception {
            AnchorPane page = FXMLLoader.load(MyApp.class.getResource("mainWindow.fxml"));
            Scene scene = new Scene(page);
            primaryStage.setScene(scene);
            primaryStage.setTitle("Communication entre 2 contrôleurs");
            primaryStage.show();
        }
    }
    Contrôleur de la fenêtre principale.
    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
    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
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Node;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
     
    import java.io.IOException;
    import java.net.URL;
    import java.util.ResourceBundle;
     
    public class MainWindowController implements Initializable {
        //FIELDS
        @FXML private Button newFruitButton;
        @FXML private Label addedFruitLabel;
     
        @FXML private TableView<Fruit> fruitTable;
        @FXML private TableColumn<Fruit, String> nameColumn;
        @FXML private TableColumn<Fruit, String> colorColumn;
     
        final ObservableList<Fruit> data = FXCollections.observableArrayList();
     
        /**
         * DialogController dialogController;
         */
     
        //CONSTRUCTOR
        public MainWindowController(){
            /**
             * this.dialogController = new DialogController(this);
             */
     
            this.data.add(new Fruit("Pomme", "Vert"));
            this.data.add(new Fruit("Poire", "Jaune"));
            this.data.add(new Fruit("Banane", "Jaune"));
            this.data.add(new Fruit("Orange", "Orange"));
        }
     
        //METHODS
        @Override
        public void initialize(URL url, ResourceBundle rb) {
            this.nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
            this.colorColumn.setCellValueFactory(new PropertyValueFactory<>("color"));
            this.fruitTable.setItems(this.data);
        }
     
        @FXML private void onNewFruitButtonClicked(ActionEvent event) throws IOException {
            Stage stage = new Stage();
            stage.setTitle("New fruit dialog");
            stage.setScene(new Scene(FXMLLoader.load(getClass().getResource("dialog.fxml"))));
            stage.initModality(Modality.WINDOW_MODAL);
            stage.initOwner(((Node) event.getSource()).getScene().getWindow());
            stage.show();
        }
    }
    Contrôleur de la boîte de dialogue.
    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
    40
    41
    42
    43
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import java.net.URL;
    import java.util.ResourceBundle;
     
    public class DialogController implements Initializable {
        //FIELDS
        @FXML TextField nameEntry;
        @FXML TextField colorEntry;
        @FXML Button addButton;
     
        /**
         * private MainWindowController mainWindowController;
         */
     
        //CONSTRUCTOR
        /**
         * public DialogController(MainWindowController mainWindowController) {
         *      this.mainWindowController = mainWindowController;
         * }
         */
     
        //METHODS
        @Override
        public void initialize(URL location, ResourceBundle resources) {}
     
        @FXML private void onAddButtonClicked(){
            /**
             * Ajout d'un fruit dans la table.
             *
             * mainWindowController.data.add(new Fruit("Kiwi", "Vert"));
             */
     
            /**
             * Mise à jours du label de la fenetre principale pour indiquer un ajout dans la table.
             *
             * mainWindowController.addedFruitLabel.setText(
             *      this.nameEntry.getText().toString()+" "+this.colorEntry.getText().toString()+" a été ajouté.");
             */
        }
    }
    FXML de la fenêtre principale.
    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
     
     
    <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity"
                minHeight="-Infinity" minWidth="-Infinity"
                prefHeight="282.0" prefWidth="487.0"
                xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1"
                fx:controller="MainWindowController">
       <children>
          <TableView fx:id="fruitTable" layoutX="14.0" layoutY="14.0" prefHeight="250.0" prefWidth="250.0">
            <columns>
              <TableColumn fx:id="nameColumn" prefWidth="123.0" text="Name" />
              <TableColumn fx:id="colorColumn" prefWidth="114.0" text="Color" />
            </columns>
          </TableView>
          <Button fx:id="newFruitButton" layoutX="353.0" layoutY="14.0" mnemonicParsing="false" onAction="#onNewFruitButtonClicked" text="Ajouter un fruit" />
          <Label fx:id="addedFruitLabel" layoutX="300.0" layoutY="71.0" prefHeight="16.0" prefWidth="172.0" />
       </children>
    </AnchorPane>
    FXML de la boîte de dialogue
    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
     
     
    <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity"
                minHeight="-Infinity" minWidth="-Infinity"
                prefHeight="156.0" prefWidth="325.0"
                xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1"
                fx:controller="DialogController">
       <children>
          <TextField fx:id="nameEntry" layoutX="137.0" layoutY="19.0" />
          <Label layoutX="17.0" layoutY="24.0" text="Nom du fruit :" />
          <Label layoutX="17.0" layoutY="65.0" text="Couleur du fruit :" />
          <TextField fx:id="colorEntry" layoutX="136.0" layoutY="62.0" />
          <Button fx:id="addButton" layoutX="245.0" layoutY="113.0"
                  mnemonicParsing="false"
                  onAction="#onAddButtonClicked" text="Ajouter" />
       </children>
    </AnchorPane>
    Classe permettant de gérer les donner de la TableView.
    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
    import javafx.beans.property.*;
     
    public class Fruit {
        //FIELDS
        private final SimpleStringProperty name;
        private final SimpleStringProperty color;
     
        //CONSTRUCTOR
        public Fruit(String name, String color){
            this.name = new SimpleStringProperty(name);
            this.color = new SimpleStringProperty(color);
        }
     
        //METHODS : getters and setters
        public String getName(){return this.name.get();}
        public void setName(String name){this.name.set(name);}
        public String getColor(){return this.color.get();}
        public void setColor(String color){this.color.set(color);}
    }
    N'hésitez pas à faire des remarques sur ce code et à donner des pistes.

    Merci d'avance.

    PS : vous trouverez aussi les sources en pièce jointe si vous ne voulez pas faire du copier/coller. Le code compile avec ce jdk : jdk-8u45.
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Communication entre deux formulaires liés
    Par coolanso dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 28/11/2013, 18h11
  2. Communication entre deux fichiers excel dont l'un reste ferme
    Par deubelte dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 21/03/2008, 12h19
  3. Communication entre deux fichiers Excel
    Par typiquement dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/03/2008, 14h38
  4. Communication entre deux fichiers excel
    Par deubelte dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/10/2007, 14h18
  5. Communication entre fichier excel
    Par noir_desir dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 12/07/2007, 14h35

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