Partage
  • Partager sur Facebook
  • Partager sur Twitter

JTable et JTextfield

    17 août 2017 à 17:28:39

    Salut à tous ;)

    Je fais appel à vos services car je rencontre un problème dans mon application.
    Je souhaite récupérer une cellule de la JTable (1ère IHM ) et de placer le contenu dans un TextField (2ème IHM).

    J'ai deux IHM :


    1) La JTable (IHM_MesPatients)

    J'ai crée une JTable qui se remplit avec les données de ma BDD.


    2) Un Formulaire (IHM_Patient)

    Depuis la 1ère IHM, j'ai tenté ça :



       int ligne = JTable_Patient.getSelectedRow();
            Object cellule = JTable_Patient.getValueAt(ligne,2);
           // Mon_Nom.setText ((String) cellule);
           
            IHM_Patient p = new IHM_Patient(Mon_Nom);
            p.setNom((JTextField) cellule);
            p.setVisible(true);
           

    J'avais crée un TextField (nommé Mon_Nom) à côté de ma JTable pour être sûr que je récupérais bien la valeur souhaitée, lorsque je cliquais sur la ligne choisie. Cela fonctionne.

    Le constructeur de mon IHM_Patient est laissé à vide.
    J'ai tenté d'y passer le paramètre JTextField et d'utiliser les setter, mais sans succès...

    Merci à vous =) :)









    -
    Edité par Petitevache 17 août 2017 à 17:32:05

    • Partager sur Facebook
    • Partager sur Twitter
      18 août 2017 à 10:43:47

      Salut. Pourquoi tu passes un JtextField?

       p.setNom((JTextField) cellule);
      //plutôt
       p.setNom((String) cellule);



      • Partager sur Facebook
      • Partager sur Twitter
        18 août 2017 à 14:55:54

        Salut ;)

        Je passe un JTextField car dans mon IHM_Patient ( formulaire ), le champ qui contient le Nom est un JTextField.

        Même si je crée ce constructeur :

         public IHM_Patient(String nom) {
                nom = Nom.getText();
          
            }



        Lorsque je génère les get et set pour ce champ, j'obtiens :

          public JTextField getNom() {
                return Nom;
            }
        
            public void setNom(JTextField Nom) {
                this.Nom = Nom;
            }


        Ainsi sur ma 2ème IHM ( JTable ) si je fais :

         String nom = null;
                IHM_Patient p = new IHM_Patient(nom);
                p.setNom((String) cellule);
                

        On m'indique que le String ne peut pas être convertit en JTextField

        Je me mélange peut-être les pinceaux, mais j'avais lu que le contenu d'une cellule d'une JTable est de type Object.
        Il me faudrait peut-être tenter un constructeur prennant un objet en paramètre :

           public IHM_Patient(Object nom) {
                nom = Nom.getText();
          
            }

        Puis : 

         int ligne = JTable_Patient.getSelectedRow();
                Object cellule = JTable_Patient.getValueAt(ligne,2);
               //Mon_Nom.setText ((String) cellule);
               
                IHM_Patient p = new IHM_Patient(cellule);
                p.setVisible(true);
                p.setNom((JTextField) cellule);
        



         Dans ce cas j'obtiens l'erreur String cannot be cast to javax.swing.JTextField  :


         p.setNom (celulle) ne marche pas, et me propose le cast en JTextfield


         p.setNom(cellule.toString()) ne marche pas non plus et m'indique que le String ne peut pas être convertit en JTextfield.

        Des idées ? :magicien:

        Merci à vous =) 




        -
        Edité par Petitevache 18 août 2017 à 15:00:13

        • Partager sur Facebook
        • Partager sur Twitter
          18 août 2017 à 15:36:01

          Petitevache a écrit:

          Je passe un JTextField car dans mon IHM_Patient ( formulaire ), le champ qui contient le Nom est un JTextField.

          Et alors? Enlève moi ces getter/setter que l'IDE te génère.
          public void setNom(String Nom) {
                this.Nom.setText(Nom);
            }


          • Partager sur Facebook
          • Partager sur Twitter
            18 août 2017 à 15:50:21

            Tout simplement... :honte:

            Merci ;)

            Je t'avoue que je débute en Java.
            Je vais revoir mes cours sur les get/set.

            Il va falloir que j'apprenne également à me méfier des générations automatiques...:colere2:

            Merci à toi ;)

            • Partager sur Facebook
            • Partager sur Twitter
              19 août 2017 à 16:45:47

              Salut à tous ;)

              Après avoir réussi à récupérer les champs voulus de ma JTable dans les JTextfield, je souhaite à présent pouvoir en modifier le contenu ci besoin.
              J'ai réussi, mais je ne comprends pas pourquoi ça marche :lol: Ca ne me semble pas logique.

              Pour résumé :

              J'ai une première IHM (IHM_MesPatients) :      JTable qui m'affiche des données de ma BDD
              J'ai une deuxième IHM(IHM_Patient) :   de type  Formulaire


              1)


              Je récupère les cellules voulues lors du clic sur la ligne de la JTable puis j'utilise un bouton pour renvoyer ces cellules dans l'IHM_Patient :


                // Récupération de la cellule id
                      
                      int id;
                      int ma_ligne = JTable_Patient.getSelectedRow(); 
                      String maValeur = JTable_Patient.getValueAt(ma_ligne, 0).toString();
                      id= Integer.parseInt(maValeur);
                      Mon_Id.setText(maValeur);
                     
                    // Récupération de la cellule nom
                      
                      int ligne = JTable_Patient.getSelectedRow();
                      Object nom = JTable_Patient.getValueAt(ligne,2);
                      Mon_Nom.setText((String) nom);
                      
                      // Appel du constructeur de mon IHM Formulaire
                    
                      IHM_Patient p = new IHM_Patient();
                      
                      // Textfield Nom
                      p.setNom((String) nom);
                      // Textfield Id invisible
                      p.setID_Patient(maValeur);
                      // Affichage de l'IHM
                      p.setVisible(true);
                    

              j'ai utilisé deux labels (Mon_Id et Mon_Nom) à titre indicatif pour être sûr de récupérer les cellules voulues lors du clic de la ligne

              2)


              Ensuite, je récupère les cellules et les place dans les JTextfield, puis j'appelle le constructeur de ma classe Patient qui me gère la requête pour modifier le nom d'un patient



                 // Récupération du contenu des Textfield
                      String nom = Nom.getText();
                      String id = ID_Patient.getText();
                      
                      // Initialisation constructeur
                          Patient p = new Patient();
                      try {
                          p.EditTable(nom, id);
                      } catch (SQLException ex) {
                          Logger.getLogger(IHM_Patient.class.getName()).log(Level.SEVERE, null, ex);
                      }


              3)

              La requête :



              public void EditTable(String Nom, String ID_Patient) throws SQLException{
                      try {
                          con = maConnexion();
                          
                          query = " UPDATE t_patient SET Nom = ? WHERE IDPatient = ? ";
                         
                          pst = con.prepareStatement(query);
                          pst.setObject(1, Nom, Types.VARCHAR);
                          pst.setObject(2, ID_Patient, Types.INTEGER);
                          pst.executeUpdate();
                          JOptionPane.showMessageDialog(null, "Nom Modifié");
                         
                      
                           }  catch (SQLException e){
                                  JOptionPane.showMessageDialog(null, e);
                              }   
                     } 
               


              Cela fonctionne, mais je ne comprends pas pourquoi à la ligne :

              pst.setObject(2, ID_Patient, Types.INTEGER);

              il parvient à trouver l'ID puisque plus haut j'ai passé deux String en paramètres.
              Par ailleurs cela fonctionne également si je précise Types.VARCHAR alors que mon champ IDPatient est de type int dans ma BDD...

              o_O

              Je sais que la méthode setObject permet de convertir un objet dans le type SQL souhaité, mais n'est-t-il pas plus cohérent d'écrire :

              public void EditTable(String Nom, id ID_Patient)

              Merci =) :)


              Ps : Pour récupérer l'ID de la JTable, j'ai placé un composant invisible pour l'utilisateur sur mon IHM_Patient(formulaire). N'y-a-t-il pas une solution plus propre ?




              -
              Edité par Petitevache 19 août 2017 à 16:49:53

              • Partager sur Facebook
              • Partager sur Twitter

              JTable et JTextfield

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown