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 controleurs et tableview (demande avis sur une méthode)


Sujet :

JavaFX

  1. #1
    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 Communication controleurs et tableview (demande avis sur une méthode)
    Bonjour,

    Suite à un autre poste (http://www.developpez.net/forums/d15...-fichier-fxml/), j'ai constaté que je luttais un peu à mettre en place la mise à jour visuelle des données d'une tableview après l'entrée de données via une fenêtre.
    La tableview est située dans un fichier fxml et est liée à un contrôleur. La fenêtre où j'entre les données est liée elle aussi à un fichier fxml et un contrôleur.
    Avant toute chose, je tiens à préciser que le problème semble venir de la mise à jour graphique. En effet, si je passe par des system.out.println dans chacun des contrôleurs, je constate que la mise à jour au niveau du contenu de la tableview se fait bien. Néanmoins, visuellement, la ligne ajoutée n'apparaît pas à l'écran.

    Bref, dans le poste, j'avais utilisé une méthode assez bête pour effectuer l'opération... Cette fois-ci, je passe par l'accesseur et le mutateur de la propriété userData du Stage.

    Ainsi, au niveau de la méthode appelée lors de l'appui sur le bouton qui va ouvrir la fenêtre servant à insérer les données, j'ajoute un évenement onCloseRequest sur la fenêtre créée:
    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 void openPage(ActionEvent event) throws IOException {
            Stage stage = new Stage();
            stage.setTitle("Ajout Valeur");
            stage.setScene(new Scene(FXMLLoader.load(getClass().getResource("Popup.fxml"))));
            stage.setOnCloseRequest(new EventHandler<WindowEvent>(){
    
    			@Override
    			public void handle(WindowEvent event) {
    				if(null !=stage.getUserData())
    				{
    					Nawak n = (Nawak) stage.getUserData();
    					lsTable.get().add(n);
    					stage.close();
    				}
    			}
            	
            });
    Il est à noter que cette méthode est située dans le controlleur qui est lié au fichier fxml contenant la tableview. Cette dernière est définie comme variable lsTable.

    Ensuite, au niveau du controlleur lié à la fenêtre qui est créé, lorsque l'utilisateur a entré les données et qu'il clique sur le bouton enregistrer, c'est cette méthode qui est appelée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        @FXML private void saveAction(ActionEvent event) throws IOException {
    
    			Nawak n = new Nawak(coL1txt.getText(),coL2txt.getText());
    			Stage st = (Stage) save.getScene().getWindow();
    			st.setUserData(n);
    			EventHandler<WindowEvent> eh = st.getOnCloseRequest();
    			eh.handle(new WindowEvent(st, null));
    		
        }
    Ici, je stocke les données (entrées dans les textfields) via la méthode setUserData du Stage et je déclenche l'évenement OnClose pour qu'elles soient enregistrées au sein de la tableView. Par contre, je ne comprends pas trop pourquoi cela ne marchait pas quand je faisais avec: st.close() .

    Bref, je poste ce message pour avoir votre avis sur cette procédure.

    PS: Ce projet est un projet de test. Il est donc fait assez simplement et plutôt basique. Pour ce qui est des valeurs vides, je le prends bien en compte:
    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
     
    	private EventHandler<KeyEvent> enabDisab = new EventHandler<KeyEvent>() {
    		public void handle(KeyEvent t){
    	     	if("".equals(coL1txt.getText().replace(" ", "")) ||  "".equals(coL2txt.getText().replace(" ", "")))
    	     		save.setDisable(true);
    	     	else
    	     		save.setDisable(false);
    		}
    	};
     
    	@FXML
    	public void initialize() {		
    		save.setDisable(true);
    		coL1txt.setOnKeyReleased(enabDisab);
    		coL2txt.setOnKeyReleased(enabDisab);				
    	}

  2. #2
    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
    Question : quelle version du JDK utilises-tu ? (histoire de voir s'il est possible de changer la gestion de la boite de dialogue)
    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

  3. #3
    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
    Je regarderai demain. De tête, la dernière telechargée et installée c'est 8u40. Sinon, au niveau de l'IDE, je me sers d'Eclipse. Changer la version de gestion de la boîte de dialogue, est ce que cela pourrait régler le problème de rafraîchissement du tableview sur le plan visuel du tableview lors de l'ajout de données ?

    Je vous remercie pour votre aide.

    Cordialement,

    Vinou33

  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
    Code incomplet donc il a fallu inventer les bouts qui manquaient.

    Comme prévu, cela fonctionne parfaitement.
    Ton problème est probablement situe au niveau des cellValueFactory ou des cellFactory de tes colonnes si rien ne s'affiche (du moment que la table n'affiche plus "No content in table" mais des lignes, c'est qu'elle contient des données. Si aucun contenu ne s'affiche dans ces lignes mais si tu peux quand même sélectionner la première ligne a la souris c'est que cette ligne contient des données et donc qu'il manque le code correct pour les afficher).

    PS : onCloseRequest sert a intercepter le fait de fermer la fenêtre via le bouton natif du système de fenêtrage (croix en haut a gauche dans Windows) et a éventuellement annuler cette action (en consommant l’évènement), il te faut voir du cote de onHiding (juste avant que la fenêtre ne disparaisse) ou onHidden (déjà fermée).

    Nawak.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    package commfxmlcontroler;
     
    public class Nawak {
     
        public Nawak(final String text1, final String text2) {
        }
    }
    Popup.fxml
    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import java.lang.*?>
    <?import java.util.*?>
    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
     
    <VBox fx:id="rootPane" fillWidth="true"  prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" fx:controller="commfxmlcontroler.PopupController">
        <children>
            <TextField fx:id="coL1txt"/>
            <TextField fx:id="coL2txt"/>
            <HBox>
                <children>
                    <Button fx:id="save" text="Save" onAction="#saveAction" />
                </children>
            </HBox>
        </children>  
    </VBox>
    PopupController.java
    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
    package commfxmlcontroler;
     
    import java.io.IOException;
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.stage.Stage;
     
    public class PopupController implements Initializable {
        @FXML
        private TextField coL1txt;
        @FXML
        private TextField coL2txt;
        @FXML
        private Button save;
     
        @Override
        public void initialize(URL url, ResourceBundle rb) {
        }
     
        @FXML
        private void saveAction(ActionEvent event) throws IOException {
     
            Nawak n = new Nawak(coL1txt.getText(), coL2txt.getText());
            Stage st = (Stage) save.getScene().getWindow();
            st.setUserData(n);
    //        EventHandler<WindowEvent> eh = st.getOnCloseRequest();
    //        eh.handle(new WindowEvent(st, null));
            st.close();
        }
    }
    Test.java
    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
    package commfxmlcontroler;
     
    import java.io.IOException;
    import java.net.URL;
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Node;
    import javafx.scene.Scene;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
     
    public class Test extends Application {
     
        @Override
        public void start(Stage primaryStage) throws IOException {
            final URL fxmlURL = getClass().getResource("Truc.fxml");
            final FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL);
            final Node node = fxmlLoader.load();
            StackPane root = new StackPane();
            root.getChildren().add(node);        
            Scene scene = new Scene(root, 300, 250);        
            primaryStage.setTitle("Test");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
     
        public static void main(String[] args) {
            launch(args);
        }
     
    }
    Truc.fxml
    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 java.lang.*?>
    <?import java.util.*?>
    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
     
    <VBox fx:id="rootPane" fillWidth="true"  prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" fx:controller="commfxmlcontroler.TrucController">
        <children>
            <TableView fx:id="lsTable">
                <columns>
                    <TableColumn fx:id="bobColumn" text="Bob" />
                </columns>
            </TableView>
            <HBox>
                <children>
                    <Button fx:id="actionButton" text="Machin" onAction="#openPage" />
                </children>
            </HBox>
        </children>
    </VBox>
    TrucController.java
    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
    package commfxmlcontroler;
     
    import java.io.IOException;
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Scene;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.stage.Stage;
     
    public class TrucController implements Initializable {
     
        @FXML
        private TableView<Nawak> lsTable;
        @FXML
        private TableColumn<Nawak, String> bobColumn;
     
        @Override
        public void initialize(URL location, ResourceBundle resources) {
            lsTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
            bobColumn.setCellValueFactory(feature -> new SimpleStringProperty(feature.getValue().toString()));
        }
     
        @FXML
        private void openPage(ActionEvent event) throws IOException {
            Stage stage = new Stage();
            stage.setTitle("Ajout Valeur");
            stage.setScene(new Scene(FXMLLoader.load(getClass().getResource("Popup.fxml"))));
    //        stage.setOnCloseRequest(windowEvent -> {
    //            if (null != stage.getUserData()) {
    //                Nawak n = (Nawak) stage.getUserData();
    //                lsTable.getItems().add(n);
    //                stage.close();
    //            }
    //        });
            stage.setOnHidden(windowEvent -> {
                if (null != stage.getUserData()) {
                    Nawak n = (Nawak) stage.getUserData();
                    lsTable.getItems().add(n);
    //                stage.close();
                }
            });
            // Code incomplet sur le forum.
            stage.initOwner(lsTable.getScene().getWindow());
            stage.show();
        }
    }
    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
    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 vinou33 Voir le message
    Changer la version de gestion de la boîte de dialogue, est ce que cela pourrait régler le problème de rafraîchissement du tableview sur le plan visuel du tableview lors de l'ajout de données ?
    Non, pas du tout. C'etait juste pour savoir si je pouvais directement me lancer dans la création d'une boite de dialogue au lieu de créer le Stage manuellement ou pas. Finalement j'ai fait sans.
    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

  6. #6
    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
    En fait, je voulais surtout votre avis surtout sur la question de l'utilisation de ce que j'ai décrit (cette façon d'utilisation est elle bien). J'ai du mal m'expliquer et je vous présente mes excuses. Pis bon, la prochaine fois je mettrai les fichiers complets plutôt que des extraits. Quand j'utilise la méthode avec closeRequest et userData, je n'ai pas de problème et tout marche parfaitement. Mais est-ce une bonne méthode ? Par contre, je me demande juste si c'est normal que dans les autres cas (sans passer par des listener mais plutôt par des setters, getters ou l'appel de méthodes créées dans le premier contrôleur), quand je fais la mise à jour des données de la TableView via la récupération du premier contrôleur (FXMLLoader) dans le second, là rien ne se met à jour au niveau visuel. Néanmoins, quand je fais un system.out.println, celles-ci apparaissent bien comme étant mises dans les items de la TableView.

    Je vous remercie pour votre aide et je vous présente mes excuses pour le fait que j'ai mal décrit hier mes explications.

  7. #7
    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
    closeRequest() non et j'ai expliqué pourquoi plus haut. Et j'ai fait de la manière correcte dans mon code.

    userData pourquoi pas. Mais tu aurais pus également utiliser getProperties().put(<clé>, <valeur>). C'est un peu l'équivalent de ces objets fourretout qui servent à passer des données entre les vues dans certains frameworks HTML5/JavaScript. Ça marche à défaut d'être propre, mais bon on est en Java donc en général on a plutôt tendance à passer par des API et des patterns bien carré plutôt que par ce genre de bidouilles.

    Pour les "autres méthodes". Aucune idée, tu ne nous as pas fourni de code donc il est impossible de tester quoi que ce soit pour voir si c'est toi qui t'es planté ou s'il y a un bug qq part.
    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

  8. #8
    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
    Par exemple, je mets en place une méthode permettant d'insérer de nouvelles données dans la tableview :

    Le fichier SampleController.java:
    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
    package application;
    
    import java.io.IOException;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Node;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
    
    public class SampleController{
    
    	@FXML private BorderPane borderPane;
    	@FXML private TableView<Nawak> tabView;
    	@FXML private TableColumn<Nawak,String> col1;
    	@FXML private TableColumn<Nawak,String> col2; 
    	@FXML private Button openBox;
    	
    
    	private ObservableList<Nawak> dataStart = FXCollections.observableList(Stream.of(new Nawak[]{new Nawak("aa","bb"), new Nawak("cc","dd")}).collect(Collectors.toList())); 
    	
    	
    	public void addValue(Nawak obj) {
    		tabView.getItems().add(obj);
    	}
    	
    	
    	@FXML
    	public void initialize() {
    		col1.setMinWidth(tabView.getMaxWidth()/2);
    		col2.setMinWidth(tabView.getMaxWidth()/2);
    		col1.setCellValueFactory(new PropertyValueFactory<Nawak, String>("col1"));
    	        col2.setCellValueFactory(new PropertyValueFactory<Nawak, String>("col2"));		
    	        tabView.setItems(dataStart);
    	}
    	
    	@FXML 
             private void openPage(ActionEvent event) throws IOException {
                   Stage stage = new Stage();
                   stage.setTitle("Ajout Valeur");
                   stage.setScene(new Scene(FXMLLoader.load(getClass().getResource("Popup.fxml"))));
                   stage.initModality(Modality.APPLICATION_MODAL);
                   stage.initOwner(((Node) event.getSource()).getScene().getWindow());
                   stage.show();
            }
    }
    Le fichier Sample.fxml qui lui est lié:
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.layout.*?>
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.control.TableView?>
    <?import javafx.scene.control.TableColumn?>
    <?import javafx.geometry.*?>
    <?import javafx.scene.control.Label?>
     
    <BorderPane fx:id="borderPane" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController" maxWidth="500" >
    		<top>
    		<HBox spacing="10">
    		<padding>
             <Insets bottom="15.0" left="225.0" right ="12.0" top="15.0"/>
         	</padding>	
    		<Label text="Test Binding" style="-fx-font-weight:bold;-fx-text-fill: black;-fx-font-size: 1.6em;"/> 
    		</HBox>
    		</top>
    	<center>
    		<TableView fx:id="tabView" maxWidth="450">
    			<columns>
    			<TableColumn fx:id="col1" text="col1"></TableColumn>
    			<TableColumn fx:id="col2" text="col2"></TableColumn>
    			</columns>
    		</TableView>
    		</center>
    		<bottom>
    		<HBox spacing="10">
    		<padding>
             <Insets bottom="15.0" left="225.0" right ="12.0" top="15.0"/>
         	</padding>
    		<Button fx:id="openBox" text="Ajouter" prefWidth="150" prefHeight="20" onAction="#openPage"/> 
    		</HBox>
    		</bottom>
    </BorderPane>
    Ensuite, quand je clique sur le bouton enregistrer, je vais l'appeler de l'autre contrôleur, PopupController.java
    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
    package application;
    
    import java.io.IOException;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.scene.input.KeyEvent;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    
    public class PopupController{
    
    
    	@FXML private VBox popupBox;
    	@FXML private Button save;
    	@FXML private TextField coL1txt, coL2txt;
    	
    	private EventHandler<KeyEvent> enabDisab = new EventHandler<KeyEvent>() {
    		public void handle(KeyEvent t){
    	     	if("".equals(coL1txt.getText().replace(" ", "")) ||  "".equals(coL2txt.getText().replace(" ", "")))
    	     		save.setDisable(true);
    	     	else
    	     		save.setDisable(false);
    		}
    	};
    	
    	@FXML
    	public void initialize() {		
    		save.setDisable(true);
    		coL1txt.setOnKeyReleased(enabDisab);
    		coL2txt.setOnKeyReleased(enabDisab);				
    	}
    
    	@FXML private void saveAction(ActionEvent event) throws IOException {
    			FXMLLoader fl = new FXMLLoader();
    			fl.load(getClass().getResource("Sample.fxml").openStream());
    			SampleController sc = fl.getController();
    			Nawak n = new Nawak(coL1txt.getText(),coL2txt.getText());
    			Stage st = (Stage) save.getScene().getWindow();
    			sc.addValue(n);
    			st.close();
    		
        }
    }
    Le fichier Popup.fxml qui lui est lié:
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.geometry.*?>
    <?import javafx.scene.layout.*?>
    <?import javafx.scene.control.*?>
    <VBox fx:id="popupBox" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.PopupController"  prefWidth="400" spacing="10" >
    	  <padding>
             <Insets bottom="15.0" left="20.0" right ="12.0" top="15.0"/>
         	</padding>
    	  <HBox spacing="10"><Label text=" Col1" /><TextField fx:id="coL1txt" prefWidth="300" /> </HBox>
          <HBox spacing="10"><Label text=" Col2" /><TextField fx:id="coL2txt" prefWidth="300" /> </HBox>
          <HBox spacing="10">
          	<padding>
             <Insets bottom="15.0" left="175.0" right ="12.0" top="15.0"/>
         	</padding>
          	<Button fx:id="save" text="Save" onAction="#saveAction"/>
          </HBox>
    </VBox>
    Eh bien, j'obtiens rien au niveau de la TableView. Je me demandais comment régler cela. (sûrement que je ne tape pas sur le bon objet vu que là j'appelle un autre instance du SampleController via le FXMLLoader).

    Sinon, au niveau du Nawak.java:
    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
     
    package application;
     
    public class Nawak {
     
    	private String col1;
    	private String col2;
     
    	public Nawak(String col1, String col2){
    		this.col1 = col1;
    		this.col2 = col2;
    	}
     
    	public String getCol1() {
    		return col1;
    	}
     
    	public void setCol1(String col1) {
    		this.col1 = col1;
    	}
     
    	public String getCol2() {
    		return col2;
    	}
     
    	public void setCol2(String col2) {
    		this.col2 = col2;
    	}
     
    }
    Et pour finir, le main.java:
    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
     
    package application;
     
    import javafx.application.Application;
    import javafx.stage.Stage;
    import javafx.scene.Scene;
    import javafx.scene.layout.BorderPane;
    import javafx.fxml.FXMLLoader;
     
     
    public class Main extends Application {
    	@Override
    	public void start(Stage primaryStage) {
    		try {
    			BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("Sample.fxml"));
    			Scene scene = new Scene(root,600,600);
    			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);
    	}
    }
    Voilà, un exemple de problème que je rencontre.

  9. #9
    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
    PS : éviter d’utiliser la version statique de la méthode load() de la classe FXMLLoader. Cette méthode peut être problématique en plus d’être un trou de performance. Lui préférer sa version d'instance.

    Mais enfin ... c'est normal que le passage de valeur ne semble pas fonctionner !

    Dans saveAction() dans PopupController
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			fl.load(getClass().getResource("Sample.fxml").openStream());
    			SampleController sc = fl.getController();
    Comme d'autres avant toi, tu instancies un second écran sample et donc tu manipules un second controlleur lie a un controle qui n'est en aucune maniere affiche a l’écran ! Chaque appel a l'une des methodes load() de la classe FXMLLoader crée un nouvel objet graphique et le contrôleur retourne est une nouvelle instance également liée a ce nouveau noeud graphique et jamais a l'un de ceux charges précédemment.


    En fait pour resourde ce probleme, il suffit juste de passer une reference du 1er controleur au second et pis basta.
    Une implementation simple mais pas trop secure :

    SampleController.java
    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
    package application;
     
    import java.io.IOException;
    import java.net.URL;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Node;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
     
    public class SampleController{
     
    	@FXML private BorderPane borderPane;
    	@FXML private TableView<Nawak> tabView;
    	@FXML private TableColumn<Nawak,String> col1;
    	@FXML private TableColumn<Nawak,String> col2; 
    	@FXML private Button openBox;
     
     
    	private ObservableList<Nawak> dataStart = FXCollections.observableList(Stream.of(new Nawak[]{new Nawak("aa","bb"), new Nawak("cc","dd")}).collect(Collectors.toList())); 
     
     
    	public void addValue(Nawak obj) {
    		tabView.getItems().add(obj);
    	}
     
     
    	@FXML
    	public void initialize() {
    		col1.setMinWidth(tabView.getMaxWidth()/2);
    		col2.setMinWidth(tabView.getMaxWidth()/2);
    		col1.setCellValueFactory(new PropertyValueFactory<Nawak, String>("col1"));
    	        col2.setCellValueFactory(new PropertyValueFactory<Nawak, String>("col2"));		
    	        tabView.setItems(dataStart);
    	}
     
    	@FXML 
             private void openPage(ActionEvent event) throws IOException {
                   final URL fxmlURL = getClass().getResource("Popup.fxml");
                   final FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL);
                   final Parent popup = fxmlLoader.load();
                   final PopupController popupController = fxmlLoader.getController();
                   popupController.sc = this;
                   Stage stage = new Stage();
                   stage.setTitle("Ajout Valeur");
                   stage.setScene(new Scene(popup));
                   stage.initModality(Modality.APPLICATION_MODAL);
                   stage.initOwner(((Node) event.getSource()).getScene().getWindow());
                   stage.show();
            }
    }
    PopupController.java
    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
    package application;
     
    import java.io.IOException;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.scene.input.KeyEvent;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
     
    public class PopupController{
     
     
    	@FXML private VBox popupBox;
    	@FXML private Button save;
    	@FXML private TextField coL1txt, coL2txt;
     
    	private EventHandler<KeyEvent> enabDisab = new EventHandler<KeyEvent>() {
    		public void handle(KeyEvent t){
    	     	if("".equals(coL1txt.getText().replace(" ", "")) ||  "".equals(coL2txt.getText().replace(" ", "")))
    	     		save.setDisable(true);
    	     	else
    	     		save.setDisable(false);
    		}
    	};
     
    	@FXML
    	public void initialize() {		
    		save.setDisable(true);
    		coL1txt.setOnKeyReleased(enabDisab);
    		coL2txt.setOnKeyReleased(enabDisab);				
    	}
     
            SampleController sc;
     
    	@FXML private void saveAction(ActionEvent event) throws IOException {
    			Nawak n = new Nawak(coL1txt.getText(),coL2txt.getText());
    			Stage st = (Stage) save.getScene().getWindow();
    			sc.addValue(n);
    			st.close();		
        }
    }
    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

  10. #10
    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 pour l'aide. Il est vrai que je n'avais pas pensé à utiliser la méthode setScene pour passer l' instance actuelle du controlleur. Merci .

  11. #11
    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
    Quoi ?
    Non ce n'est pas du tout ça !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    popupController.sc = this;
    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

  12. #12
    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 si, techniquement c'est ça. On récupère une instance de la classe FXMLLoader paramétrée sur le fichier XML popup.xml. A partir de celle-ci on récupère aussi l'objet graphique qui va nous servir à construire le stage que l'on va afficher ainsi que le controlleur (Une instance PopupController) qui lui est associé. Ceci fait, on définit la valeur de sc, le paramètre de type SampleController de ce controlleur en lui donnant comme valeur l'instance du controlleur SampleController contenant la méthode appelée lorsque l'action est lancée. Ces opérations étant aussi réalisées dans cette méthode, il s'agit de l'instance actuelle (courante) et la valeur à donner à sc est this.

  13. #13
    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
    Oui là c'est correct et ça ne correspond pas du tout avec ce que tu as écrit précédement.

    Citation Envoyé par vinou33 Voir le message
    Il est vrai que je n'avais pas pensé à utiliser la méthode setScene pour passer l' instance actuelle du controlleur.
    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

  14. #14
    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
    D'accord, j'ai écrit un peu vite. J'aurais du préciser que c'était "indirectement". Merci pour votre aide.

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

Discussions similaires

  1. Demande avis sur une imitation de combobox
    Par NewBiePython dans le forum Tkinter
    Réponses: 0
    Dernier message: 27/04/2015, 19h48
  2. Besoin d'avis sur une méthode
    Par g_barthe dans le forum PyQt
    Réponses: 1
    Dernier message: 12/10/2007, 17h54
  3. Avis sur une méthode de gestion d'erreur
    Par mikedavem dans le forum ASP.NET
    Réponses: 4
    Dernier message: 01/08/2007, 19h26
  4. [Conception] Votre avis sur une méthode
    Par AIexis dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 17/04/2007, 18h08

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