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

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    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

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 101
    Points : 71
    Points
    71
    Par défaut
    Ben personnellement, pour récupérer depuis un contrôleur le conteneur principal (ici un vbox) et le contrôleur (ici AffichageController) d'un fichier fxml (Affichage.fxml) qui ne lui est pas lié (pas lié au contrôleur où je lance l'action de récupération), voici ce que je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    FXMLLoader affFL = new FXMLLoader();
    VBox vbAff = (VBox) affFL.load(getClass().getResource("Affichage.fxml").openStream());  
    AffichageController affCtrl = affFL.getController();
    Mais bon, j'ai découvert cela après quelques recherches sur internet et quelques tests. Les autres auront peut-être mieux à proposer. En tout cas, cela me permet d'agir entre les différentes interfaces.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    Bonjour, je n'ai pas réussi à mettre votre exemple en place pour tout simplement modifier le label de la fenêtre principale à partir du contrôleur de la boîte de dialogue.

    Voilà l'erreur que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.ClassCastException: javafx.scene.layout.AnchorPane cannot be cast to javafx.scene.control.Label
    Je ne vois donc pas comment récupérer un élément précis.

    Pouvez-vous m'éclairer ?

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Gosh, je n'ai pas trop envie de me répéter pour la 3ème fois sur le fait d'envoyer un gros pavé de code bien complet................

    Bon alors je sais que JavaFX c'est nouveau et tout et tout mais un contrôleur c'est une classe Java comme une autre donc les patrons habituels pour interagir avec des classes ou des API s'appliquent aussi !
    Quelques exemples :

    • La vue contient une ListView, TableView, ComboBox, etc. il est possible de peupler la vue depuis l'extérieur du contrôleur (l'endroit où on monte son UI ou le contrôleur parent si on a une une UI composée de plusieurs FXML inclus les uns dans les autres) en écrivant dans le 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
      @FXML
      private ListView<Truc> listView;
       
      @Override
      protected void initializable(final URL location, final ResourceBundle resource) {
           // PS : on pourrait utiliser une SortedList ou une FilteredList aussi !!!!!!
           listView.setItems(listeDeTrucs);
      }
       
      private final ObservableList<Truc> listeDeTrucs = FXCollections.observableList(new LinkedList());
       
      /**
       * Retourne la liste des trucs dans ce controle.
       * @return Une {@code ObservableList<Truc>} que l'utilisateur peut peupler pour afficher des trucs dans le contrôle.
       */
      public final ObservableList<Truc> getTrucs() {
          return trucs;
      }
      Et depuis le monde extérieur :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      // Créer des trucs dans une autre portion du code ou de l'interface.
      [...]
      // Peupler la vue.
      zeControler.getTrucs().setAll(truc1, truc2, truc3);
    • La vue contient une ListView, TableView, ComboBox, etc. il est possible d'exposer la sélection au monde extérieur en écrivant dans le contrôleur :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      @FXML
      private ListView<Truc> listView;
       
      /**
       * Retourne la sélection.
       * @return Une {@code ObservableList<Truc>} non-modifiable.
       */
      public ObservableList<Truc> getSelectedTrucs() {
         return listView.getSelectionModel().getSelectedItems();
      }
      Et depuis le monde extérieur :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      zeControler.getSelectecTrucs.addListener(change -> {
          // Faire kekechose quand la sélection change dans la vue.
          // ex: activer ou désactiver une autre partie de l'interface graphique.
      });
    • La vue contient un Button ou un truc avec lequel on interagit mais qui doit lancer une action. Il est possible de configurer cette action depuis le monde extérieur en écrivant dans le 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
      @FXML
      private void handleZeButton()  {
         final Optional<EventHandler<ActionEvent>> eventHandlerOptional = Optional.ofNullable(getOnZeButtonActivated());
         eventHandlerOptional.ifPresent(eventHandler -> eventHandler.handle(new ActionEvent(this, null));
      }
       
      private final ObjectProperty<EventHandler<ActionEvent>> onZeButtonActivated = new SimpleObjectProperty(this, "onZeButtonActivated");
       
      /**
       * Retourne l'action à exécuter quand le bouton est cliqué.
       * @return Une instance de {@code EventHandler<ActionEvent>}, peut être {@code null}.
       */
      public final EventHandler<ActionEvent> getOnZeButtonActivated() {
          return onZeButtonActivated.get();
      }
       
      /**
       *  Défini l'action à exécuter quand le bouton est cliqué.
       * @param value La nouvelle valeur, peut être {@code null}.
       */
      public final void setOnZeButtonActivated(final EventHandler<ActionEvent> value) {
          onZeButtonActivated.set(value);
      }
       
      /**
       * Retourne la propriété {@code onZeButtonActivated}.
       * @return Une instance de {@code ObjectProperty<EventHandler<ActionEvent>>}, jamais {@code null}.
       */
      private final ObjectProperty<EventHandler<ActionEvent>> onZeButtonActivatedProperty() {
         return onZeButtonActivated;
      }
      Donc par défaut ça fait rien mais on peut configurer tout ça depuis depuis le monde extérieur :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      zeControler.setOnZeButtonActivated(actionEvent -> System.out.println("Hello World!");
      Et voilà c'est magique ! Alors qu'avant ça ne faisait rien quand on cliquait sur le bouton, désormais ça imprime "Hello World!", c'est-t-y pas magique !!!!!!!
    • Etc avec des trucs Java plus simpliste sans passer par des events ou des propriétés FX... Faut juste savoir faire preuve d'imagination


    Et donc, comme on pilote alors le contrôle depuis l’extérieur au lieu de depuis l'intérieur (quand tout est codé en dur dans le contrôle), alors c'est magique : on le rend bien plus réutilisable (comme les contrôles standards de l'API en fait) et indépendant du reste de l'application (donc on peut les réutiliser à l’identique dans d'autres applis), y a plus besoin de passer des référence à des trucs obscurs qu'on oublie de nettoyer ou qui ne sont pas correctement initialisés ici et là dans les constructeurs.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    Bonjour,

    Je ne me rappelle que vous m'ayez dit de ne pas poster de code complet. Je note donc pour l'avenir. Je pensais simplement qu'il serait plus facile pour vous de comprendre le problème avec ce code exemple minimal plutôt qu'avec des bouts de code par-ci par-là.

    Concernant vos remarques, en effet je n'avais pas pensé aux choses les plus simples. Je parle ici de votre premier point (peupler la vue depuis l'extérieur du contrôleur).
    On s'en sort rapidement avec peu de code et ça fonctionne bien. Il y a juste a créer les méthodes "setters" dans le contrôleur principal et a créer un objet "controllerPrincipal" dans le contrôleur de la boîte de dialogue. On peut ensuite dans cette dernière utiliser les méthodes "setters" du contrôleur de la fenêtre principale.

    Cela fonctionne bien, je passe donc le sujet en "résolu".

    Merci pour vos explications.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par Mat08 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.ClassCastException: javafx.scene.layout.AnchorPane cannot be cast to javafx.scene.control.Label
    L'erreur est claire, y a un truc qui est en fait un AnchorPane mais qui est casté en Label quelque part.

    Oui sinon ce n'est pas vraiment ce que j’appelle un code simple pour ce genre de problème. Un code simple ça aurait été deux contrôles avec des FXML presque vides, les deux contrôleurs qui vont avec, un truc central pour tenter de piloter le tout et une tentatives de faire passer un trucs simple de l'un à l'autre. Bref, le genre de chose qu'on écrit dans un projet de test en dehors du projet principal pour faire des tests pour tenter d'isoler et de résoudre le problème.
    C'est vraiment un réflexe que vous devez tenter de prendre lors de vos développements sinon vous n'arriverez pas bien loin sur des projets très complexes.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 101
    Points : 71
    Points
    71
    Par défaut
    Tiens, essaies ça dans DialogController.java, ça marche chez moi. J'ai été un peu violent sur la dernière opération mais bon, finalement, ça permet de faire le changement en live.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
          @FXML private void onAddButtonClicked() throws IOException{
        	FXMLLoader fl = new FXMLLoader();
            AnchorPane ap = (AnchorPane) fl.load(getClass().getResource("mainWindow.fxml").openStream());
        	Fruit fr = new Fruit(nameEntry.getText(),colorEntry.getText());    	
        	@SuppressWarnings("unchecked")
    	TableView<Fruit> tv = (TableView<Fruit>) ap.getChildren().get(0);
        	ObservableList<Fruit> lsOld = tv.getItems();
        	ObservableList<Fruit> newItems = lsOld;
        	newItems.add(fr);
        	Stage st = (Stage) addButton.getScene().getWindow();
        	((TableView<Fruit>)((AnchorPane)st.getOwner().getScene().getRoot()).getChildren().get(0)).setItems(newItems);
        	st.close();
           }
    PS: je l'ai écrit un peu vite, je te laisse simplifier le code si tu le prends ^^.

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    Oui j'avais bien compris cette erreur. Je n'avais tout simplement pas compris ce que je faisais. Après avoir cherché un peu j'ai compris le mécanisme de ta proposition vinou33.
    La méthode de bouye me plait. C'est basique, pas compliqué, ca fonctionne bien et ca permet d'être utilisé depuis n'importe quelle classe.

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 101
    Points : 71
    Points
    71
    Par défaut
    Petite modification après un petit test. Je change le code en ajout et pas en modification ^^. De plus, il est plus court:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     @FXML private void onAddButtonClicked() throws IOException{
        	FXMLLoader fl = new FXMLLoader();
    	AnchorPane ap = (AnchorPane) fl.load(getClass().getResource("mainWindow.fxml").openStream());
        	Fruit fr = new Fruit(nameEntry.getText(),colorEntry.getText());    	
        	@SuppressWarnings("unchecked")
        	Stage st = (Stage) addButton.getScene().getWindow();
        	((TableView<Fruit>)((AnchorPane)st.getOwner().getScene().getRoot()).getChildren().get(0)).getItems().add(fr);
        	st.close();
    }
    Tu sais, c'était juste pour finaliser ce que j'avais commencé que je mettais ça ^^.

    PS: Si quelqu'un sait comment dans l'utilisation de cette méthode (avec ou non récupération du controller) on peut mettre à jour le tableview autrement que par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	Stage st = (Stage) addButton.getScene().getWindow();
        	((TableView<Fruit>)((AnchorPane)st.getOwner().getScene().getRoot()).getChildren().get(0)).getItems().add(fr);
    Je suis preneur ^^. En effet, là je l'ai retiré mais même quand je mets une méthode de mise à jour du composant dans l'autre contrôleur et que j'appelle la méthode après avoir récupéré le contrôleur (via la façon que j'ai mis dans ma première réponse), cela ne marche pas.

    Merci d'avance ^^.

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    @vinou33 Normalement en ajoutant les méthodes publiques qu'il faut aux divers contrôleurs ça devrait. Là par contre faudrait voir le code de ce que tu as essayé de faire.
    L'exemple que j'ai donné est pour une liste mais ça marche bien sur pour une table de la même manière.

    Généralement il faut éviter de manipuler la scène ainsi ; tout simplement car on est pas à l'abri d'un ClassCastException et ensuite car ça ne fonctionnera plus quand on change son contenu souvent bien sur.

    Une méthode alternative serait dans le même genre (exploration de la scène) serait d'utiliser lookup() à la place mais c'est également foireux pour les mêmes raisons (ClassCastException et contenu qui change) en plus d'avoir le soucis d'un contrôle qui a la même ID ou le même style qu'un autre. De plus, apparemment, lookup() ne peut pas traverser certains contrôles comme ScrollPane.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 101
    Points : 71
    Points
    71
    Par défaut
    Merci. J'ai trouvé de quoi m'occuper pour mon petit aller retour en train de la journée. Je vais d'abord tester avec les accesseurs mutateurs (je ne sais plus si j'avais pas déjà tenté et pareil avec d'autres méthodes en public. Je dois peut-être mal faire, vais chercher). Je regarderai l'autre méthode aussi. Je copie colle son explication.

+ 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