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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 101
    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 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 101
    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 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    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

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 101
    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.

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    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

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    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

+ 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