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

Composants Java Discussion :

JTable : Caster le contenu des cellules


Sujet :

Composants Java

  1. #1
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut JTable : Caster le contenu des cellules
    Bonjour les amis;
    Je dois mettre à jour ma bdd à partir des données de ma JTable et je récupère ces infos comme ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    PreparedStatement request = myConn.prepareStatement(maRequete);
    TableModel model = AddReception2.Table.getModel();
    // directement avec le table model
        for (int i = 0; i < model.getRowCount(); i++) {
        request.setInt(1, model.getValueAt(i, 0));//Colonne 1
        request.setString(2, (String) model.getValueAt(i, 1));//Colonne 2
        request.setString(3, (String) model.getValueAt(i, 2));//Colonne 3
        request.execute();
        request.clearParameters();
      }
    ...
    il se trouve que dans la bdd les champs sont de type (int, dec, num). Ce qui fait que lors de la validation, j'ai une erreur de ce type :
    Exception occurred during event dispatching:
    java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at ci.interGraph.AddReception$4.actionPerformed(AddReception.java:501)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    Je me permet de demander comment convertir les valeurs des cellules avant validation afin que la bdd les accepte.
    Merci de votre aide
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  2. #2
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut C'est bizarre
    Salut The Watcher,


    Pour commencer, je préciserai qu'il n'est pas nécessaire d'instancier un modèle de table pour lire la table. La méthode getValueAt(int ligne, int colonne) est accessible depuis JTable.
    En fait, dans un cas comme dans l'autre, cette méthode renvoie un objet. Hors, la méthode setInt du PreparedStatement nécessite pour paramètre deux int. Si bien que dans la première ligne de ta boucle, request.setInt(1, model.getValueAt(i, 0)); devrait interdire la compilation ??? mais comme tu présentes un message d'erreur en exécution, ça me trouble. Bref, je ne l'ai pas testé, peut-être que ça compile sans erreur, mais quoi qu'il en soit, je penses qu'il vaudrait mieux faire comme ça :
    request.setInt(1, Integer.valueOf(model.getValueAt(i, 0).toString()).intValue());

    Ensuite, pour les deux lignes suivantes, il suffit de récupérer un String, pour cela rien de plus simple, la classe Object, donc toutes les classes, possède une méthode toString(). Il suffit donc d'invoquer cette méthode pour obtenir sous forme de String n'importe quel objet. Les deux lignes suivantes donnent donc :
    request.setString(2, model.getValueAt(i, 1).toString());
    request.setString(3, model.getValueAt(i, 2).toString());

    Par contre, quelque chose me trouble, c'est le message d'erreur.
    Ce dernier indique un problème de casting. En effet, comme le dit le message, un Integer ne peut être casté en String. Pourtant, c'est la deuxième ligne de ta boucle, le premier setString qui réalise ce type de casting en premier. Cela signifierai que non seulement ce que je dis au début à propos de la méthode setInt ne pose pas de problème à la compilation mais en plus elle s'éxecuterait ???... La, je ne comprends plus.
    Est-tu sûr d'avoir relevé la première erreur ?

    Pourrais-tu montrer le schéma de la table concernée, et une ligne de valeur fictive de ta table ?
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  3. #3
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    Cher pursang,
    J'aimerais avant toute chose te dire merci pour la promptitude.
    En effet comme tu viens de le constater, je pensais que mon problème venait aussi du problème de casting car j'avais bien avant de mettre en place tout ça tester cela mais c'était avec des string et dans la bdd les champ étaient de type varchar. Mais cette fois dans mon appli, les champs sont de type integer, decimal et varchar, c'est pourquoi j'ai interpreter l'erreur comme un problème de casting.
    Je te met en deux fichiers que j'utilise : la TableModel, et l'entité
    (LotRessu.java et LotRessuTableModel.java)

    Merci encore.
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour faire simple, tu ne sépares de loin pas assez les classes responsables de l'interface graphique de celles responsable de la base de donnée.

    Si tu veux faire quelque chose d'un tout petit peu propre:

    Tu commences par créer un bean contenant les données affichées dans les colonnes, donc dans ton cas une classe portant le nom de Réception et ne contenant que les informations qui seront affichées dans la JTable (en private bien sûr, avec les setters et getters qui vont bien).

    Puis tu crées ton propre modèle de JTable, héritant d'AbstractTableModel et se basant sur une Liste d'objets de type Reception et faisant en sorte que le getValueAt, le setValueAt modifient directement les objet de type Reception (penser au fireTableRowsUpdated dans le setValueAt), et que les méthodes getRowCount, getColumnCount, getColumnClass, getColumnName soient correctement implémentées, plus quelques méthodes accessoires permettant d'ajouter une nouvelle ligne, d'en supprimer une autre (penser au fireTableRowsInserted/Deleted dans ce genre de cas.
    Pour ce qui est du modèle, cf les chapitres 3 et 4 du tuto suivant: http://baptiste-wicht.developpez.com.../swing/jtable/


    Puis tu crées un classe (encore mieux tu appliques le pattern DAO) qui sera responsable de l'insertion d'une Reception, ou d'une liste d'objet Reception en base.

    Cette classe devra toutefois être appelée depuis un thread séparé du thread graphique (celui dans lequel tu te trouves lorsqu'un listener se déclenche) au moyen de la classe SwingWorker
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    Merci sinok,
    Pour ta participation et tes remarques. Je n'ai pas joint les autres classes à ma réponse sinon en effet comme tu le dis pour afficher les données de ma bdd c'est ce que j'ai pris l'habitude de faire, j'ai environ trois classes responsables de l'interface graphique : une model de la Table qui hérite vraiment de l'AbstractTableModel que j'applique à ma Jtable, j'aussi un classe dans qui implémente un serialisable dans laquelle je déclare les champs utilisé c'est en fait mon entité et aussi une classe DAO.. que j'utilse pour maper ma bdd, quant aux paramètres de connexion, ils sont une classe à part que j'appelle dans la DAO.

    Sauf que cette fois-ci c'est une action contraire que je veux réaliser à savoir, insérer les données d'une Jtable dans la bdd. Tu m'as expliquer la procedure dans un poste ici il n'y a pas très longtemps seulement j'ai besoin un peu de temps pour bien comprendre tout ça c'est pourquoi j'avais demandé un exemple.
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Si tu as ton entité, que vas tu faire à appliquer directement les données issues du modèle aux paramètres d'un resultset
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Très bien
    J'avoue avoir un peu de mal à suivre là. Mais la dernière remarque de sinok est pertinente, effectivement, si dans l'ensemble tu utilises déjà des technologies que je me permet de cataloguées complexes (c.a.d. dures à comprendre pour un autodidacte non informaticien d'origine) que vient faire un PreparedStatement là-dedans ?....
    Pour ma part, je ne connais pas du tout cette classe DAO. Je suis loin d'être un spécialiste des bdd, j'utilise netbeans avec les EJB et si je l'exprime bien, une persistance avec hibernate. Je penses que je ne manipule pas au mieux cet ensemble de classes dédiées aux dialogues appli<=>bdd, mais c'est quand même particulièrement agréable de manipuler ses tables comme des objets.
    Bref, en se limitant au code fournit, et d'après ce que j'en ai dit, est-ce que ça fonctionne après correction ou pas ?

    D'ailleurs, j'ai cliqué sur votre lien DAO, sinok, et je vous quitte maintenant pour dévorer tout cela, ça à l'air très intéressant...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  8. #8
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    Merci à tous;

    en fait le principe de la requête préparée (PreparedStatement) que j'ai fais ici est de construire un requête vierge, dans laquelle les paramètres sont remplacés par des points d’interrogation, qui représentent des valeurs que je récupère dans la JTable et qui seront positionnées par la suite. C'est vrai qu'en récupérant les données à partir de la liste paraît plus commode mais comme je l'ai dit il me faut un peu de temps pour maîtriser tout ça avec un timing à respecter.
    Cependant la solution de pursang m'a permis de résoudre le problème.

    Merci à vous tous.
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

Discussions similaires

  1. Ajuster le contenu des cellules de jtable en milieu
    Par opensource dans le forum Composants
    Réponses: 2
    Dernier message: 17/03/2008, 15h03
  2. Remplacer le contenu des cellules de destination
    Par cyraile dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/11/2006, 08h23
  3. Réponses: 2
    Dernier message: 19/06/2006, 14h05
  4. [VBA]comptage de lignes en fonction du contenu des cellules
    Par calimero91 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 22/12/2005, 11h38
  5. [JTable]Aligner le contenu des cellules
    Par )3lade dans le forum Composants
    Réponses: 2
    Dernier message: 09/03/2004, 13h24

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