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

JDBC Java Discussion :

Model de Jtable, getValueAt, NullPoniteurException


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 89
    Par défaut Model de Jtable, getValueAt, NullPoniteurException
    Bonjour,

    Un petit stress avec la surcharge de la méthode getValueAt de la classe AbstractTableModel,

    Je crois avoir plus ou moins cerné le problème, la ligne me renvoyant l'erreur est celle ou j'essai de récupérer le contenu de la cellule avec getObject(col+1), l'origine de mes malheurs est la possibilité d'avoir des valeurs null, qui apparement ne plaisent pas trop...

    J'ai essayé de corriger le pas avec un test de valeur null, mais je suppose que c'est la méthode getObject qui jette l'exception, donc si je ne me plante pas j'aurais beau faire tous les tests possible et imaginable l'exception sera lancé avant tout test...

    J'ai un peu écumer google, pas de solution miracle, j'ai trouvé des trucs ou il parlait de récupérer le type avec un getClass j'ai eu beau retourner le truc dans tous les sens ça ne change rien...

    Autrement tout s'affiche correctement, seulement les cellules null passent pas...

    Quelqu'un aurais une idée, je mets mon code a la suite, si quelqu'un a le courage de jetter un coup d'oeil :

    méthode getValueAt :

    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
     
    @Override
        public String getValueAt(int row, int col) {
            try{
            this.rs.absolute(row+1);
            }
            catch(Exception exc){
               String err = exc.toString();
               System.out.println("ça plante getValueAt() absolute EmployeTableModel : " + err);
               exc.printStackTrace();
               return "0";
            }
     
            try{
     
            String tmp; 
            if ( rs.getObject(col+1).equals(null))
                return "0";
            else return tmp = rs.getObject(col+1).toString();
                    /*if("".equals(tmp))
                return "0";*/
     
            }
            catch(Exception exc){
               String err = exc.toString();
               System.out.println("ça plante getValueAt() getObject EmployeTableModel : " + err);
               exc.printStackTrace();
               return "0";
            }
    et ma déclaration de modèle :

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    import java.awt.*;
    import java.awt.event.*;
    import java.text.*;
    import java.sql.*;
    import javax.swing.*;
    import javax.swing.table.*;
     
    import java.util.*;
     
    /**
     *definition du modele de tableau d'affichage des employes
     * etend AbstractTableModel classe abstraite et implèmente
     * les methodes getValueAt, getColumnName, getColumnCount
     * de la classe abstraite
     * 
     * @author David Gentil
     */
    public class EmployeTableModel extends AbstractTableModel {
        private ResultSet rs;
        private ResultSetMetaData rsmd;
     
        public EmployeTableModel(ResultSet rs) throws SQLException{
            this.rs = rs;
            this.rsmd =rs.getMetaData();
        }
     
        @Override
        public String getValueAt(int row, int col) {
            try{
            this.rs.absolute(row+1);
            }
            catch(Exception exc){
               String err = exc.toString();
               System.out.println("ça plante getValueAt() absolute EmployeTableModel : " + err);
               exc.printStackTrace();
               return "0";
            }
     
            try{
     
            String tmp; 
            if ( rs.getObject(col+1).equals(null))
                return "0";
            else return tmp = rs.getObject(col+1).toString();
                    /*if("".equals(tmp))
                return "0";*/
     
            }
            catch(Exception exc){
               String err = exc.toString();
               System.out.println("ça plante getValueAt() getObject EmployeTableModel : " + err);
               exc.printStackTrace();
               return "0";
            }
     
     
        }
     
     
        @Override
        public String getColumnName(int col){
            try{
                return (this.rsmd.getColumnName(col+1).toString()) ;
            }
            catch (Exception exc){
                String err = exc.toString();
                System.out.println("ça plante getColumnName() EmployeTableModel: " + err);
                exc.printStackTrace();
                return "0";
            }
        }
        @Override
        public int getColumnCount(){
            try{
                return this.rsmd.getColumnCount();
            }
            catch(Exception exc){
                String err = exc.toString();
                System.out.println(" ça plante again getColumnCount() EmployeTableModel :" + err);
                exc.printStackTrace();
                return 0;
            }
        }
        @Override
        public int getRowCount(){
            try{
            this.rs.last();
            return this.rs.getRow();            
            }
            catch (Exception exc){
                String err = exc.toString();
                System.out.println(" ça plante getRowCount() EmployeTableModel "+err);
                exc.printStackTrace();
                return 0;
            }
        }
        @Override
        public boolean isCellEditable(int row, int col){
            if( col == 0 )
                return false;
            else return true;
        }
     
     
    }

  2. #2
    Membre expérimenté
    Profil pro
    Dev NodeJS
    Inscrit en
    Août 2006
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev NodeJS

    Informations forums :
    Inscription : Août 2006
    Messages : 177
    Par défaut
    Ton resultset est plein? Combien de colonnes?
    Ta JTable a combien de colonnes?
    Quelle est la valeur de col quand ca plante?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 89
    Par défaut
    mon resultset est bien plein, côté BDD, ça roule a peu près,
    ma Jtable a 8 colonnes, 14 lignes
    j'obtiens bien les affichages sur les colonnes renseignées,

    j'ai des erreurs sur :

    Ligne col
    3 6
    5 6
    6 6
    8 3
    10 6
    11 6

    en gros, la ou la cellule est de valeur nulle...

    je te met un exemple de trace :

    Ligne 52 correspondant a : if((rs.getObject(col+1).equals(null)))
    et ligne 24 au début de la déclaration de la classe

    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
     
    ça plante getValueAt() getObject EmployeTableModel : java.lang.NullPointerExceptioncolonne : 6ligne : 11
            at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
            at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
    java.lang.NullPointerException
            at connexionbdd.EmployeTableModel.getValueAt(EmployeTableModel.java:52)
            at connexionbdd.EmployeTableModel.getValueAt(EmployeTableModel.java:24)
            at javax.swing.JTable.getValueAt(JTable.java:2639)
            at javax.swing.JTable.prepareRenderer(JTable.java:5653)
            at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2072)
            at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1974)
            at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1770)
            at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
            at javax.swing.JComponent.paintComponent(JComponent.java:763)
            at javax.swing.JComponent.paint(JComponent.java:1027)
            at javax.swing.JComponent.paintChildren(JComponent.java:864)
            at javax.swing.JComponent.paint(JComponent.java:1036)
            at javax.swing.JViewport.paint(JViewport.java:747)
            at javax.swing.JComponent.paintChildren(JComponent.java:864)
            at javax.swing.JComponent.paint(JComponent.java:1036)
            at javax.swing.JComponent.paintChildren(JComponent.java:864)
            at javax.swing.JComponent.paint(JComponent.java:1036)
            at javax.swing.JComponent.paintChildren(JComponent.java:864)
            at javax.swing.JComponent.paint(JComponent.java:1036)
            at javax.swing.JComponent.paintChildren(JComponent.java:864)
            at javax.swing.JComponent.paint(JComponent.java:1036)
            at javax.swing.JLayeredPane.paint(JLayeredPane.java:564)
            at javax.swing.JComponent.paintChildren(JComponent.java:864)
            at javax.swing.JComponent.paintToOffscreen(JComponent.java:5129)
            at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
            at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
            at javax.swing.JComponent.paint(JComponent.java:1013)
            at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
            at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
            at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
            at java.awt.Container.paint(Container.java:1797)
            at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:734)
            at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
            at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
            at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
            at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 89
    Par défaut Yep ! J'ai !!!


    Bon en fait l'idée de tester le type de donnée, était bonne, mais mal implémentée, le truc que j'avais trouvé sur un forum quelconque ne pouvais marcher, j'avais bon quand je disais que de toute façon l'exception était jeté avant le test, la solution passait par la récupération du type de la colonne en cours de traitement puis un cast tout simple lors de la récup avant de renvoyer la valeur.

    Le résultat est un peu sale... mais au moins ça tourne et je peut avancer ! un peu préssé par le temps, j'ai d'autres trucs a finir de poser, je m'attarderais plus longtemps sur ça plus tard, je mets le code corrigé (attention y'a du nettoyage a faire mais l'idée est là)

    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
     
    @Override
        public Object getValueAt(int row, int col) {
            try{
            this.rs.absolute(row+1);
            }
            catch(Exception exc){
               String err = exc.toString();
               System.out.println("ça plante getValueAt() absolute EmployeTableModel : "
                       + err + "colonne : "+ col + "ligne : " + row);
               exc.printStackTrace();
               return 0;
            }
     
            try{
                if(this.rsmd.getColumnTypeName(col+1).toUpperCase().startsWith("VARCHAR"))
                    return rs.getString(col+1);
                else if(this.rsmd.getColumnTypeName(col+1).toUpperCase().startsWith("INT")){
                    Integer i = new Integer(rs.getInt(col+1));
                    return i;}
                else if(this.rsmd.getColumnTypeName(col+1).toUpperCase().startsWith("DECIMAL")){
                    Double i = new Double(rs.getDouble(col+1));
                    return i;}
                else if(this.rsmd.getColumnTypeName(col+1).toUpperCase().startsWith("DATE"))
                    return rs.getDate(col+1);
            }
            catch(Exception exc){
               String err = exc.toString();
               System.out.println("ça plante getValueAt() getObject EmployeTableModel : " 
                       + err + "colonne : "+ col + "ligne : " + row);
               exc.printStackTrace();
               return 0;
            }
            return 0;
        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème JTable getValueAt(int,int)
    Par trin86 dans le forum Composants
    Réponses: 8
    Dernier message: 16/02/2009, 19h29
  2. Model pour JTable
    Par nonolerobot77 dans le forum Composants
    Réponses: 7
    Dernier message: 12/04/2007, 16h17
  3. [JTreeTable/JTable] getValueAt appelée nul part
    Par Zanton dans le forum Composants
    Réponses: 9
    Dernier message: 02/06/2006, 14h16
  4. [JTable] Forcer le rechargement du model
    Par tmcgrady dans le forum Composants
    Réponses: 7
    Dernier message: 29/04/2005, 15h47
  5. [Swing][TableColumnModel] model colonnes de JTable
    Par imothep dans le forum Composants
    Réponses: 2
    Dernier message: 18/06/2004, 17h32

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