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 & Persistance


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 72
    Par défaut JTable & Persistance
    Bonjour,

    je suis en train d'essayer d'afficher une table contenant des record que je récupère avec JPA .

    j'ai créé mon propre TableModel de la facon suivante :

    UnitsextSheets est ma classe de persistance.

    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
     
    private class MyUnitsextSheetTableModel extends DefaultTableModel {
    private static final long serialVersionUID = 1L;
     
    		List<UnitsextSheets> sheets;
    		String[] headers;
     
    		public MyUnitsextSheetTableModel(List result,  Object[] header){
    			sheets = (List<UnitsextSheets>) result;
    			headers = (String[]) header;
    		}
     
            public Class getColumnClass(int column) {
    			switch (column) {
                	case 0:
                		return Boolean.class;
                    default:
                          return String.class;
    			}
    		}
     
            public int getRowCount() {
            	return sheets.size();
            }
     
            public int getColumnCount() {
            	return headers.length;
            }
            public String getColumnName(int colIndex){
            	return headers[colIndex];
            }
     
            public Object getValueAt(int rowIndex, int colIndex){
            	switch (colIndex) {
            		case 1:
            			return sheets.get(rowIndex).getImported();
            		default:
            			return "empty";
            	}
            }
     
    	}
    à l’exécution tout se passe bien , je récupère bien ma liste de sheet donc pas de problème du coté de la requête HQL, par contre quand la table fait appele à getRowCount sheet.size() plante car sheet est null.

    et je ne comprend pas pourquoi .

    avant ca je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableModel tm = new MyUnitsextSheetTableModel(result, currentHeader.toArray());
    avez vous une idée ou une explication pour faire ca au mieux .


    et deuxieme question , comment je peux faire que lorsque je change une valeur dans la table, mon objet persistant se mette a jour (donc change dans la base) ????


    merci pour votre aide

  2. #2
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Puisque tu gères toi-même le contenu de ta table, tu devrais plutôt utiliser un AbstractTableModel qu'un DefaultTableModel (dans la foulée, mettre "sheets' en private serait pas mal). Ca n'explique toutefois pas ton problème. Pourrais-tu fournir la trace exacte de ton exception ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 72
    Par défaut
    génial chatanga, j'ai changé pour AbstractTableModel et maintenant ça fonctionne.

    par contre vu les explications que j'ai trouvé sur la différence entre ces deux modèles je n'arrive pas a comprendre pourquoi l'autre pose un probleme.

    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
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at ch.is.util.extsalesimports.main.JImportHQFiles$MyUnitsextSheetTableModel.getRowCount(JImportHQFiles.java:702)
    	at javax.swing.table.DefaultTableModel.setDataVector(DefaultTableModel.java:207)
    	at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:107)
    	at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:89)
    	at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:69)
    	at ch.is.util.extsalesimports.main.JImportHQFiles$MyUnitsextSheetTableModel.<init>(JImportHQFiles.java:687)
    	at ch.is.util.extsalesimports.main.JImportHQFiles.displayUnitsextSheetsTable(JImportHQFiles.java:637)
    	at ch.is.util.extsalesimports.main.JImportHQFiles.findSheets(JImportHQFiles.java:539)
    	at ch.is.util.extsalesimports.main.JImportHQFiles.access$3(JImportHQFiles.java:534)
    	at ch.is.util.extsalesimports.main.JImportHQFiles$ActionEventHandler.actionPerformed(JImportHQFiles.java:464)
    	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)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    	at java.awt.Component.processMouseEvent(Component.java:6216)
    	at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
    	at java.awt.Component.processEvent(Component.java:5981)
    	at java.awt.Container.processEvent(Container.java:2041)
    	at java.awt.Component.dispatchEventImpl(Component.java:4583)
    	at java.awt.Container.dispatchEventImpl(Container.java:2099)
    	at java.awt.Component.dispatchEvent(Component.java:4413)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
    	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
    	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
    	at java.awt.Container.dispatchEventImpl(Container.java:2085)
    	at java.awt.Window.dispatchEventImpl(Window.java:2475)
    	at java.awt.Component.dispatchEvent(Component.java:4413)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    ou alors il se pourrait bien qu il y ait une histoire avec

    javax.swing.table.DefaultTableModel.setDataVector()

    je comprend ni pourquoi ni comment il est appelé , mais j ai lu qqch comme quoi le DefaultDataModel stoquait les data dans un vecteur.

  4. #4
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Si tu regardes plus en détail la trace que tu as fournie (lignes 6 et 7), tu constatera que l'exception se produit durant l'appel au constructeur du parent de MyUnitsextSheetTableModel (c'est à dire DefaultTableModel). Comme ce constructeur est appelé avant celui de MyUnitsextSheetTableModel, l'appel qui y fait à la méthode getRowCount lève en toute logique une NPE.

    Pour information, DefaultDataModel est une implémentation de AbstractTableModel utilisant un Vector pour stocker les éléments. Il est en quelque sorte à AbstractTableModel ce que ArrayList est à List. Donc, soit tu hérites de DefaultTableModel et utilises son Vector pour stocker tes éléments, soit tu hérites de AbstractTableModel et gères toi-même ton stockage (comme tu le fais actuellement).

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 72
    Par défaut
    en fait si je comprend bien et apparemment ça se vérifie,

    l appel au constructeur de DefaultTableModel, fait qq part un appel à getRowCount(), et comme je l'ai redéfini comme prenant la taille de sheets qui n'est pas encore instancié, j'ai un NPE.

    si j enlève la redéfinition je n'ai plus d'erreur.

    quoi qu il en soit effectivement la solution est d utiliser un AbstractTableModel


    merci bcp !!!

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ensimag
    Inscrit en
    Octobre 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ensimag
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 57
    Par défaut
    tu dois verifier si ton result que tu passes en parametre au contructeur est null

    et tu peux utiliser le constructeur des List pour construire ta list sheets

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

Discussions similaires

  1. [JList - JTable] Renderer persistent
    Par Paniez dans le forum Composants
    Réponses: 2
    Dernier message: 01/10/2009, 13h58
  2. jTable, Persistance et bindings
    Par sherkal dans le forum NetBeans
    Réponses: 0
    Dernier message: 04/04/2009, 11h38
  3. JBuilder7 & JTable Colonne alignement
    Par Tonton Luc dans le forum JBuilder
    Réponses: 5
    Dernier message: 06/11/2002, 17h32
  4. Réponses: 9
    Dernier message: 12/08/2002, 07h38

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