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 :

Problèmes pour mettre des données dans un tableView


Sujet :

JavaFX

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur en alternance
    Inscrit en
    Décembre 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur en alternance
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2016
    Messages : 112
    Points : 29
    Points
    29
    Par défaut Problèmes pour mettre des données dans un tableView
    Bonjour,
    J'ai une IHM avec un tableView possédant 5 colonnes créé avec sceneBuilder mais je n'arrive pas à trouver comment faire pour mettre une donnée dans une cellule d'une colonne (j'ai un tableau d'objet et les propriétés de cet objet doivent se mettre dans chaque colonne).
    L'ai regarder avec les combobox et les listView mais apparement c'est la même chose. Mon but est de pouvoir ensuite déplacer les éléments dans le tableau, si jamais il existe un truc qui permet d'afficher un peu de la même façon je suis preneur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        public void rafraichirTableView(){
            for(ElementInit elem : scenar.tabElement){  //j'importe un tableau qui vient d'une autre classe
                    combo.setValue(elem.rang);
                    tableView.getItems().setAll(elem.rang,elem.nom,elem.cheminFichier,elem.duree,elem.descriptif);
                    tableNumElem.setVisible(true);
                    tableNumElem.setUserData(elem.nom);
     
                //tableNumElem.set
                /*tableNom.setText(elem.nom);
                tableChemin.setText(elem.cheminFichier);
                tableTemps.setText(Integer.toString(elem.duree));
                tableDescriptif.setText(elem.descriptif);  */
            }
        }

  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
    Chaque colonne TableColumn<V, S> de la TableView<V> requiert une fabrique qui va créer un adaptateur qui permet de convertir ou de transposer ce qui est contenu dans l'objet en une propriété ObjectProperty<S> affichable (et potentiellement éditable) par cette colonne. Cette fabrique a adaptateur est settable par la méthode setCellValueFactory() de la colonne (a ne pas confondre avec setCellFactory() qui sert a placer une fabrique pour générer les cellules destinées a l'affichage).

    L'API fourni quelques méthodes prêtes a l'emploi pour obtenir des fabriques basées sur l’introspection et ainsi accéder facilement a des propriétés pas trop complexes : PropertyValueFactory

    Mais ca n'est souvent pas tres complique d'ecrire une telle fabrique. Difficile de te conseiller du code par contre vu qu'on ne sais pas trop comment est fichu l'objet que tu affiches dans ta table. Mais par exemple si tu as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    final Class Toto {
        private final StringProperty name = new StringProperty();
     
        public String getName() {
            return name.get();
        }
     
       public StringProperty nameProperty() {
           return name;
       }
    }
    Alors tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TableView<Toto> table = [...]
    TableColumn<Toto, String> nameColumn = [...]
    nameColumn.setCellValueFactory(new PropertyValueFactory("name"));
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TableView<Toto> table = [...]
    TableColumn<Toto, String> nameColumn = [...]
    nameColumn.setCellValueFactory(feature -> {
       final Toto value = feature.getValue();
       return value.nameProperty();
    });
    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
    Nouveau membre du Club
    Homme Profil pro
    Développeur en alternance
    Inscrit en
    Décembre 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur en alternance
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2016
    Messages : 112
    Points : 29
    Points
    29
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public void rafraichirTableView(){
            for(ElementInit elem : scenar.tabElement){
                    tableView.getItems().setAll(elem.rang,elem.nom,elem.cheminFichier,elem.duree,elem.descriptif); //les cellules s'affichent (tableView c'est le nom du tableau
                    tableNumElem.setCellValueFactory(new PropertyValueFactory(Integer.toString(elem.duree))); //tableNumElem c'est le nom de la colonne
            }
        }
    Ok, je n'utilise pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TableView<Toto> table = [...]
    TableColumn<Toto, String> nameColumn = [...]
    car mes colonnes et mon table view ont été crées avec SceneBuilder
    Malgré cela rien ne s'affiche dans mes cellules...

  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
    Citation Envoyé par Java Ou Javapas Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void rafraichirTableView(){
            for(ElementInit elem : scenar.tabElement){
                    tableView.getItems().setAll(elem.rang,elem.nom,elem.cheminFichier,elem.duree,elem.descriptif); //les cellules s'affichent (tableView c'est le nom du tableau
                    tableNumElem.setCellValueFactory(new PropertyValueFactory(Integer.toString(elem.duree))); //tableNumElem c'est le nom de la colonne
            }
        }
    J'ai l'impression que même toi tu ne comprends pas très bien ce que tu essaies de faire... en plus pourquoi ici chaque ligne de ta table contient des valeurs différentes en provenance d'un seul élément ? Ce n'est pas plutôt 1 élément par ligne que tu souhaiterai avoir avec les valeurs qui s'affichent dans les colonnes appropriées ????????????????

    Une TableView c'est juste une grosse liste. Fondamentalement c'est exactement la meme chose qu'une ListView ou une ComboBox. La seule grosse différence, c'est qu'elle affiche son contenu sur plusieurs colonnes et que chaque colonne offre une vue différente du même objet. Donc on met les ElementInit dans la table et ensuite chaque colonne se débrouille pour extraire la bonne valeur dans l'objet qu'elle cherche a afficher avec sa fabrique a adaptateur.

    PropertyValueFactory permet de créer un binding utilisant l'introspection pour retirer une propriété nommée dans l'objet contenu dans la table. Ainsi dans mon exemple new PropertyValueFactory("name") permet de cibler la propriété "name" de la classe Toto en cherchant via l'inspection soit nameProperty() si c'est une propriété JavaFX soit getName() (ou même isName() d'ailleurs) si c'est juste un Javabean normal (tout cela est décrit dans la doc de la classe). Donc je ne vois pas trop ce que tu tentais de faire ici.

    On va essayer d'expliquer ça plus simplement : tu es sur la ligne N de ta table ; comme toutes les autres lignes de ta table la valeur contenue est de type ElementInit... tu es dans la colonne tableNumElem et tu veux afficher le champ duree contenu dans un élément... c'est un champ donc ce n'est pas une propriété... et il est est en accès direct (on ne passe pas par un getter)... donc la solution avec PropertyValueFactory ne convient pas... donc tu ne peux pas utiliser PropertyValueFactory... donc il te faut manuellement créer un adaptateur qui pour n'importe quel objet de type ElementInit va convertir adapter son champ duree de type int -> ObjectProperty<Integer> (avec la bonne valeur dedans).

    Note : à cause de la signature de la fabrique, ici, on ne peut pas utiliser IntegerProperty car cette classe n’hérite pas de ObservableValue<Integer> mais de ObservableValue<Number> (les concepteurs de l'API ont été un peu bizarres sur le coup) ce qui ne correspond pas au type de retour de la fabrique. Donc on va utiliser ObjectProperty<Integer> a la place.

    Donc ce qu'on va faire :
    1. Définir la fabrique sur la colonne appropriée. On a besoin de faire ça une seule fois, par exemple au moment ou on monte l'UI (la méthode initialize() est un bon choix pour ça)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      tableNumElem.setCellValueFactory(feature -> {
          ElementInit elem = feature.getValue();
          return new SimpleObjectProperty<>(elem.duree);
      });
      // Faire qq chose de similaire pour les autres colonnes de la table.
      [...]
    2. Et quand on change le contenu de la table, on met directement les éléments dedans pas leur contenu. Les adaptateurs se chargeront de récupérer les bons trucs.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      public void rafraichirTableView(){
           tableView.getItems().setAll(scenar.tabElement)
      }
    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
    Nouveau membre du Club
    Homme Profil pro
    Développeur en alternance
    Inscrit en
    Décembre 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur en alternance
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2016
    Messages : 112
    Points : 29
    Points
    29
    Par défaut
    Merci beaucoup pour ton aide, c'est beaucoup plus clair maintenant !!
    Par contre il ne reconnait pas le .getValue...il me propose equals(), hashCode(), getClass(), notify(), notifyAll(), toString() et wait()

  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
    Quel type as-tu attribué à ta colonne (et à ta table par la même occasion) dans sa déclaration et montre moi le code en question STP.
    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
    Nouveau membre du Club
    Homme Profil pro
    Développeur en alternance
    Inscrit en
    Décembre 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur en alternance
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2016
    Messages : 112
    Points : 29
    Points
    29
    Par défaut
    Je n'ai attribué aucun type à la table et aux colonnes car je l'ai créée avec sceneBuilder
    Si c'est le code du tableView que tu veux le voici :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
             <TableView fx:id="tableView" layoutX="836.0" layoutY="85.0" prefHeight="714.0" prefWidth="685.0">
               <columns>
                 <TableColumn fx:id="colonneNum" prefWidth="75.0" text="N°element" />
                 <TableColumn fx:id="colonneNom" prefWidth="104.0" text="Nom element" />
                   <TableColumn fx:id="colonneChemin" prefWidth="121.0" text="Chemin" />
                   <TableColumn fx:id="colonneTemps" minWidth="0.0" prefWidth="60.0" text="Temps" />
                   <TableColumn fx:id="colonneDescriptif" prefWidth="324.0" text="Descriptif" />
               </columns>
             </TableView>
    Comment faire pour attribuer un type car si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableView<String> tableView = new TableView<String>;
    Il va me créer un nouveau un tableau..et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          tableView=new TableView<String>();
          colonneNum=new TableColumn<Object,Object>();
    ne fonctionne pas

  8. #8
    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
    Houla stop !!!!

    Il va falloir prendre l'habitude de bien expliquer ton problème toi (valable aussi pour l'autre sujet que tu as ouvert)... Car ça te permettra de mieux appréhender la chose. Donc en gros en faisant ainsi, la première personne que tu aidera ça sera toi-même (ce qui peut te permettre de trouver la solution tout seul) et ensuite les gens qui vont tenter de t'apporter de l'aide (aides-les a mieux t'aider).

    Tu nous montres une TableView décrite dans un FXML... mais ensuite tu nous montres une TableView initialisée par du code ?????
    Ensuite tu nous montre une TableView<String> alors que visiblement ton code précédent ainsi que mes explication auraient du nous mener a une TableView<ElementInit>.
    Alors pourquoi n'avons nous pas dans ton code :

    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
    @FXML
    private TableView<ElementInit> tableView;
     
    @FXML
    private TableColumn<ElementInit, Integer> colonneNum;
     
    @FXML
    private TableColumn<ElementInit, String> colonneNom;
     
    @FXML
    private TableColumn<ElementInit, String> colonneChemin;
     
    @FXML
    private TableColumn<ElementInit, Duration> colonneTemps; // J'ai mis ici le type Duration au pif car je ne sais pas ce que contient ta classe ElementInit vu que tu ne nous l'a jamais montrée.
     
    @FXML
    private TableColumn<ElementInit, String> colonneDescriptif;
    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

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur en alternance
    Inscrit en
    Décembre 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur en alternance
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2016
    Messages : 112
    Points : 29
    Points
    29
    Par défaut
    Tu nous montres une TableView décrite dans un FXML... mais ensuite tu nous montres une TableView initialisée par du code ?????
    Ensuite tu nous montre une TableView<String> alors que visiblement ton code précédent ainsi que mes explication auraient du nous mener a une TableView<ElementInit>.
    Je n'ai trouvée sur internet que des personnes qui donnait des types a leur colonne en passant par du code et je ne savais pas qu'on pouvait le faire dans la déclaration.
    J'ai mis du code pour initialiser une TableView pour montrer que je ne pouvais pas faire cela car ça me créait un nouveau TableView.

    Il va falloir prendre l'habitude de bien expliquer ton problème toi (valable aussi pour l'autre sujet que tu as ouvert)... Car ça te permettra de mieux appréhender la chose. Donc en gros en faisant ainsi, la première personne que tu aidera ça sera toi-même (ce qui peut te permettre de trouver la solution tout seul) et ensuite les gens qui vont tenter de t'apporter de l'aide (aides-les a mieux t'aider).
    En effet, j'ai beaucoup de mal à expliquer les choses...j'essaye de m'améliorer mais c'est pas facile...


    MERCI !!!! Ça marche parfaitement !!!!

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Je viens de voir votre discussion et j'ai le même problème. Sauf qu'il y a une différence, dans mon cas à la place de ElemInit c'est un objet de type NomClasse<Number,Number> et je voudrais savoir si c'est la même façon de faire du coup. Il y a surement quelque chose que je n'ai pas compris dans l'explication. Merci d'avance.

  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
    Fondamentalement y a rien de différent, mais sans voir de code sur la manière dont tu as tenté de faire la chose c'est difficile de te répondre. Ouvre un nouveau sujet et expose clairement ton problème, avec du code qui permette de voir ce qui ne va pas ou de tester (apprendre à sortir le problème qui te cause des soucis du contexte du gros projet sur lequel tu bosses pour le mettre dans un petit projet de test -que tu peux du coup publier à autrui sans dévoiler les secrets de ta boite- est déjà un premier pas vers la solution).
    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. Réponses: 1
    Dernier message: 01/08/2013, 18h23
  2. [C#] Problème pour récuperer des données dans une datatgridview
    Par Faible37 dans le forum Débuter
    Réponses: 2
    Dernier message: 22/03/2012, 10h26
  3. [1.x] problème pour reprendre des données dans une DB
    Par phoelis1 dans le forum Symfony
    Réponses: 4
    Dernier message: 02/04/2008, 11h54
  4. Problème pour rentrer des données dans MySQL
    Par Sandara dans le forum Requêtes
    Réponses: 8
    Dernier message: 06/06/2006, 10h59
  5. Réponses: 3
    Dernier message: 05/12/2005, 02h30

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