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 :

éditer une TableView<Object[]>


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut éditer une TableView<Object[]>
    Bonsoir tout le monde!!!!!! SVP j'aimerais savoir comment éditer une tableView.

    j'ai une requête SQL du genre:
    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
     
    public List<Object[]> NotesEtu(String fil,String sem,String ue, Integer anne){
     
             EntityManager em = fab.createEntityManager();
             String query;
             query ="select e , n from Etudiant e ,Semmestre s,Filiere   f,Annscolaire a ,Cours c, Notes n ,Inscription i, Programmerue g \n"
                     + "Where s.nomsem = '"+sem+"'\n"
                     + "AND f.libelle = '"+fil+"'\n"
                     + "AND a.idAnne = "+anne+"\n"
                     + "AND c.codecours = '"+ue+"'\n"  
                     + "AND e.idetu =n.idetu \n"
                     + "AND e.idetu =i.idEtudiant \n"
                     + "AND n.idetu =i.idEtudiant \n"
                     +"AND c.idcours =g.cour \n"
                     +"AND c.idcours =n.idcours \n"
                     +"AND n.idcours =g.cour\n"
                     +"AND g.semmestres = s.idsem \n"
                     +"AND g.filier = f.idfil \n"
                     +"AND i.fac = f.idfil \n"
                     +"AND i.fac = g.filier \n"
                     +"AND a.idAnne =n.annesco \n"
                     +"AND i.annee = n.annesco \n"
                     +"AND a.idAnne = i.annee \n";
     
     
             Query q;
             q = em.createQuery(query);
           return  (List<Object[]>) q.getResultList();
     
         }
    Et ensuite je l'affiche dans ma tableView (private TableView<Object[]> tabNotes en fessant :
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
        public void genererNotesNomEeu() {
     
            noteNameEtu.setCellValueFactory(feature -> {
                final Object[] value = feature.getValue();
                final Etudiant nometu = (Etudiant) value[0];
                return new SimpleObjectProperty<>(nometu);
            });
            notePrrenomEtu.setCellValueFactory(feature -> {
                final Object[] value = feature.getValue();
                final Etudiant prenom = (Etudiant) value[0];
                return new SimpleObjectProperty<>(prenom);
            });
            note1.setCellValueFactory(feature -> {
                final Object[] value = feature.getValue();
                final Notes note1 = (Notes) value[1];
                return new SimpleObjectProperty<>(note1);
            });
            note2.setCellValueFactory(feature -> {
                final Object[] value = feature.getValue();
                final Notes note2 = (Notes) value[1];
                return new SimpleObjectProperty<>(note2);
            });
            noteExamen.setCellValueFactory(feature -> {
                final Object[] value = feature.getValue();
                final Notes noteE = (Notes) value[1];
                return new SimpleObjectProperty<>(noteE);
            });
     
            noteNameEtu.setCellFactory(tv -> new TableCell<Object[], Etudiant>() {
                public void updateItem(final Etudiant value, final boolean empty) {
                    super.updateItem(value, empty);
                    String text = null;
                    if (!empty && value != null) {
                        text = value.getNometu();
                    }
                    setText(text);
                }
            });
     
            notePrrenomEtu.setCellFactory(tv -> new TableCell<Object[], Etudiant>() {
                public void updateItem(final Etudiant value, final boolean empty) {
                    super.updateItem(value, empty);
                    String text = null;
                    if (!empty && value != null) {
                        text = value.getPrenometu();
                    }
                    setText(text);
                }
            });
            note1.setCellFactory(tv -> new TableCell<Object[], Notes>() {
                public void updateItem(final Notes value, final boolean empty) {
                    super.updateItem(value, empty);
                    String text = null;
                    if (!empty && value != null) {
                        text = "" + value.getDevoire1();
                    }
                    setText(text);
                }
            });
     
            note2.setCellFactory(tv -> new TableCell<Object[], Notes>() {
                public void updateItem(final Notes value, final boolean empty) {
                    super.updateItem(value, empty);
                    String text = null;
                    if (!empty && value != null) {
                        text = "" + value.getDevoire2();
                    }
                    setText(text);
                }
            });
            noteExamen.setCellFactory(tv -> new TableCell<Object[], Notes>() {
                public void updateItem(final Notes value, final boolean empty) {
                    super.updateItem(value, empty);
                    String text = null;
                    if (!empty && value != null) {
                        text = "" + value.getExamen();
                    }
                    setText(text);
                }
            });
     
     
    }
    jusque la tous marche bien et mon tableau s'affiche correctement avec les données mais je n'arrive pas a modifer la valeur d'une cellule mais j'ai ajouter tabNotes.setEditable(true);
    voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    noteExamen.setOnEditCommit((TableColumn.CellEditEvent<Object[], Notes> t) ->
                        {
                return ( t.getTableView().getItems().get(
                        t.getTablePosition().getRow())
                        ).setDevoire1(t.getNewValue());
            }
                    );
    le setDevoire1 est souligné par netbeans!!!
    je vous en prie aider moi svp

  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
    Si tu veux éditer la table et conserver les valeurs modifiées il va te falloir créer un objet modèle qui maintienne ses propriétés de manière permanente. Quand tu fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      noteNameEtu.setCellValueFactory(feature -> {
                final Object[] value = feature.getValue();
                final Etudiant nometu = (Etudiant) value[0];
                return new SimpleObjectProperty<>(nometu);
            });
    C'est très facile pour afficher les valeurs dans la table mais tu coup la propriété créée est liée à rien du tout et toute modification de sa valeur passe totalement inaperçue.

    Une première approche simple consiste, juste avant le return, à mettre en place un écouteur sur la propriété pour savoir quand elle a changé de valeur de manière faire quelque chose de la nouvelle valeur (ex: la stocker dans le tableau ou encore la commit dans la base).

    Une seconde approche plus complexe est de créer un objet disposants de propriété JavaFX appropriées qui viendra en remplacement de ton Object[] dans la table, cet objet sera donc le nouveau modèle de la table. Tu peux ensuite écouter chacune des propriété de cet objet pour faire l'action appropriée lors de sa modification.

    Perso je favoriserai plus la seconde méthode car même si elle demande de coder plus de trucs, elle a le mérite de permettre si tu es suffisamment attentif de désenregistrer les écouteurs quand tu nettoie ta table ce qui évite les fuites mémoire ; tandis que si tu y va de manière bourrine avec la première solution, tu créera plein d'écouteurs que tu désenregistres jamais et sera donc une source de rétention de références.

    Dans ton cas tu es parti sur une modification de l'éditeur, pourquoi pas, ca peut aussi fonctionner mais tu coup tu vas devoir modifier tous les éditeurs. En plus en faisant ça tu te places en amont de la validation du processus d'édition donc conceptuellement c'est pas vraiment le bon endroit.

    le setDevoire1 est souligné par netbeans!!!
    Ben setOnEditCommit() est sensé retourner une valeur, donc si tu appelles setDevoire1(t.getNewValue()) qui est de type void ça marchera sans doute pas. Faudrait couper l'instruction en deux.
    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 averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut
    ok!!!! merci pouvez-vous me donner quelque instruction ou comment faire pour la seconde approche svp!!!!

  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
    Créer un objet, on va dire EtudiantModel ou un truc du genre, vu ce que fait ta requête SQL, avec les propriétés JavaFX qu'il faut pour chacune des valeurs retournées dans ton Object[]. Rajouter une méthode qui va convertir ta List<Object[]> en List<EtudiantModel>. Changer le type de la table de TableView<Object[]> vers TableView<EtudiantModel> puis changer chacune des fabriques de valeur pour retourner directement la propriété de l'objet courant plutôt que de créer une nouvelle propriété fabriquée au vol.

    Note1 : si certaines propriétés ne sont pas sensées êtres éditables après la construction du modèle tu peux les définir en ReadOnlyObjectProperty<T> aussi.

    Note2 : dans le cas où tu as des nombres entiers, par exemple, l'objet étudiant devra avoir des ObjectProperty<Integer> au lieu de IntProperty tout simplement car la fabrique à value retourne des ObjectProperty<T>.

    Ensuite vérifier que tout s'affiche correctement dans la table.

    Ensuite activer les bon éditeurs pour les bons types.

    Et enfin écouter les propriété des objets de la liste et lancer la sauvegarde si besoin quand ces valeurs changent.
    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 averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut
    crée un Objet de quel Type??
    ou vous voulez dire de crée une classe si c'est le cas j'aimerais savoir si ce que j'ai fait est bien????
    ou j'ai pas bien compris ce que vous voulez dire!!!!
    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
    65
    66
    67
    68
    69
     
    public class ModelEtudiant implements Serializable {
     
     
        private ReadOnlyObjectProperty<Etudiant> id;
     
        private StringProperty nomEtu;
        private SimpleStringProperty prenom;
     
        private ObjectProperty<Double> note1;
        private ObjectProperty<Double> note2;
        private ObjectProperty<Double> examen;
     
        public void setPrenom(SimpleStringProperty prenom) {
            this.prenom = prenom;
        }
     
        public SimpleStringProperty getPrenom() {
            return prenom;
        }
     
     
     
     
        public void setNomEtu(SimpleStringProperty nomEtu) {
            this.nomEtu = nomEtu;
        }
     
        public void setId(ReadOnlyObjectProperty<Etudiant> id) {
            this.id = id;
        }
     
        public void setNote1(ObjectProperty<Double> note1) {
            this.note1 = note1;
        }
     
        public void setNote2(ObjectProperty<Double> note2) {
            this.note2 = note2;
        }
     
        public void setExament(ObjectProperty<Double> examen) {
            this.examen = examen;
        }
     
        public StringProperty getNomEtu() {
            return nomEtu;
        }
     
        public ReadOnlyObjectProperty<Etudiant> getId() {
            return id;
        }
     
        public ObjectProperty<Double> getNote1() {
            return note1;
        }
     
        public ObjectProperty<Double> getNote2() {
            return note2;
        }
     
        public ObjectProperty<Double> getExamen() {
            return examen;
        }
     
     
     
     
     
    }

  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
    C'est bien ça ?

    Mais pourquoi avoir rendu Serializable un objet qui servira uniquement dans l'UI pour faire le lien entre la TableView et la couche qui se chargera de répercuter les modifications dans la base ?
    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: 13
    Dernier message: 31/08/2007, 13h53
  2. éditer une étiquette
    Par prison_break dans le forum VB 6 et antérieur
    Réponses: 27
    Dernier message: 27/06/2007, 08h39
  3. [JFreeChart]Problème avec une List<List<Object>>
    Par maxlegrand dans le forum 2D
    Réponses: 1
    Dernier message: 15/06/2007, 22h45
  4. Problème avec une classe... "without object"
    Par z980x dans le forum C++
    Réponses: 8
    Dernier message: 27/04/2006, 16h00
  5. Recherche d'un outil pour éditer une police True Type
    Par annedeblois dans le forum Windows
    Réponses: 2
    Dernier message: 31/10/2005, 14h06

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