[JAVA] JTable

JTable [JAVA] - Java - Programmation

Marsh Posté le 01-05-2002 à 17:31:20    

Comment éviter que le remplissage d'une JTAble renvoye une exception lorsqu'il rencontre une valeur nulle pour une cellule ?

Reply

Marsh Posté le 01-05-2002 à 17:31:20   

Reply

Marsh Posté le 01-05-2002 à 18:17:53    

try {
}
catch (NullpointerException npe) {
}


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 01-05-2002 à 19:10:23    

Que tu places ou ?
Dans getValueAt(int row, int col)  
ou dans setValueAt(Object value, int row, int col)
 
Pour initialiser la table, le système utilise vraiment ces méthodes ou celles ci ne sont utilisées que pour la màj éventuelle des données ?

Reply

Marsh Posté le 01-05-2002 à 21:28:23    

Ca dépend à quel moment tu dois envoyer l'exception :  
 
getValueAt (...) est utilisé par ja JTable pour récupérer la donnée du modèle au moment de l'affichage...
setValueAt() est ce que tu dois utilser pour mettre à jour une valeur du modèle...
 
Donc, à mon avis, c'est plutôt dans setValueAt()

Reply

Marsh Posté le 01-05-2002 à 22:19:31    

C'est au moment de l'affichage que j'ai des éléments nuls du modèle à afficher.
Dois je les transformer en chaînes vides pour que la JTable m'affiche une cellule vide ?
 
Les cellules ne seront pas éditables, je ne devrais donc pas avoir besoin de setValueAt(...)

Reply

Marsh Posté le 01-05-2002 à 23:56:59    

Ah, okaye, ouai, alors, c'est bien dans le getValueAtr qu'il faut le mettre, je croyais que tu voulais une exception lors du remplissage du modèle.

Reply

Marsh Posté le 02-05-2002 à 22:49:16    

Bon maintenant j'ai une merde avec mon modèle.
Y'a t-il des limites à redéfinir les méthodes getRowCount(), getValueAt(), ... car en implèmentant un vector pour alimenter la JTable, celle-ci me renvoye un NullPointerException en tentant d'accéder à la méthode getRowCount() ?
N'y comprends + rien :
 
Je suis persuadé que l'erreur est vraiment conne mais ça fait un moment que je bataille.  
Voici le code en question :  
 
Classe définissant le modèle de la JTable :  
 
package societe.traitement;
 
import javax.swing.table.AbstractTableModel;
import java.util.Enumeration;
import java.util.Vector;
import societe.stockage.ListeV;
import societe.stockage.ListeVStockable;
import societe.donnees.employe.*;
 
class EmpTableModel extends AbstractTableModel {
     
 static final String[] COL_NAMES = {"Agence",
          "Nom",
          "Prénom",
          "Adresse",
          "Tél.",
          "N° Sécu.",
          "Date embauche",
          "Matricule"};
 private Vector rows = null;
         
 public EmpTableModel(ListeVStockable empData) {
   
  Vector rows = new Vector();
   
  /*for(Enumeration e = empData.getEnum(); e.hasMoreElements(); ) {
   this.rows.add(e.nextElement());      
  }*/
  rows.add( empData.elementNum(0) );
  rows.add( empData.elementNum(1) );
  rows.add( empData.elementNum(2) );
 }  
     
    public int getColumnCount() {
        return COL_NAMES.length;
        }
 
    public int getRowCount() {
       System.out.println("Nbre éléments dans le vector : "+rows.size());  
     return rows.size();  
    }
 
    public String getColumnName(int col) {
        return COL_NAMES[col];
    }
 
    public Object getValueAt(int row, int column) {
    Vector tmprow = new Vector();
    tmprow = (Vector)rows.elementAt(row);
    return tmprow.elementAt(column);
   }
 
    public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
    }    
 
    public boolean isCellEditable(int row, int col) {
      return false;
    }      
}
 
Je suis obligé de remplir le vector à la mano sinon il plante dés l'instanciation de EmpTableModèle ?  
J'ai testé le passage des données au constructeur -> pas de pbs  
Ca semble venir du vector mais je vois pas  
 
Voici la mèthode qui créer la JTable :
 
package societe.traitement;
 
import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.JTable;
import javax.swing.JScrollPane;
 
import societe.donnees.employe.*;
import societe.stockage.*;
import societe.traitement.EmpTableModel;
import societe.ihm.MainFrame;
import societe.ihm.AboutDialog;
 
    ...
 
 public void actionAfficherEmploye() {
   
     EmpTableModel myModel = new EmpTableModel(cListe);
     JTable tableEmp = new JTable(myModel);
  tableEmp.setPreferredScrollableViewportSize(new Dimension(500, 70));
  JScrollPane scrollPane = new JScrollPane(tableEmp);              
 
     mainFrame.add(scrollPane, BorderLayout.CENTER);
     
 mainFrame.pack();
 }
   ...

Reply

Marsh Posté le 02-05-2002 à 23:40:05    

Facile :
 
ton code :  
 
 private Vector rows = null;
       
public EmpTableModel(ListeVStockable empData) {
 
 Vector rows = new Vector();
 
 /*for(Enumeration e = empData.getEnum(); e.hasMoreElements(); ) {
  this.rows.add(e.nextElement());      
 }*/
 rows.add( empData.elementNum(0) );
 rows.add( empData.elementNum(1) );
 rows.add( empData.elementNum(2) );
}  
 
dans le constructeur, tu écris "Vector rows = new Vector()"
 
mais dans la déclaration d'attributs, tu a déjà déclaré ce vecteur....Donc, bête question de visibilité : tu instancie un vecteur qui n'est pas l'attribut de ta classe, mais un vecteur qui n'est visible que dans le constructeur....
 
Remplace ton constructeur par  :
 
 public EmpTableModel(ListeVStockable empData) {
 
 rows = new Vector();
 
 /*for(Enumeration e = empData.getEnum(); e.hasMoreElements(); ) {
  this.rows.add(e.nextElement());      
 }*/
 rows.add( empData.elementNum(0) );
 rows.add( empData.elementNum(1) );
 rows.add( empData.elementNum(2) );
}  
 
 
Ca devrait beaucoup mieux marcher! (enfin, je me suis pas penché sur la suite, mais si tu as une NullPointerException, a mon avis, ça devrait aider!! :D
 
Et n'aie pas honte, je me suis fait avoir aussi au début (et même pas qu'au début!)

Reply

Marsh Posté le 03-05-2002 à 00:02:04    

C'est fou ce qu'on peut se faire chier copieusement pour anneries.
Mais à force de galères ça devrait aller mieux.
 
Merci de ton aide

Reply

Marsh Posté le 03-05-2002 à 00:06:28    

Ah tiens, c'est à peu près ce que je m'étais dit aussi!! :D

Reply

Marsh Posté le 03-05-2002 à 00:06:28   

Reply

Marsh Posté le 03-05-2002 à 15:32:18    

Un pb de résolu et 10 de retouvé !
 
C'est maintenant le cast de la méthode :
    getValueAt(int row, int column) {  
         ...
         tmprow = (Vector)rows.elementAt(row);
         ...
    }
A la compile ça baigne mais à l'éxécution il m'envoye une erreur de cast :  
Exception occurred during event dispatching:
java.lang.ClassCastException: societe.donnees.employe.Employe
...
 
Pour m'en sortir je suis obligé de caster manuellement à la bourin chaque attribut de mon objet :
 
    public Object getValueAt(int row, int column) {
     Object obj = null;
        switch(column) {
         case 0 : obj = ((Employe)rows.elementAt(row)).getAgenceEmp();break;
         case 1 : obj = ((Employe)rows.elementAt(row)).getNomEmp();break;
         case 2 : obj = ((Employe)rows.elementAt(row)).getPrenonEmp();break;
         case 3 : obj = ((Employe)rows.elementAt(row)).getAdrEmp();break;
         case 4 : obj = ((Employe)rows.elementAt(row)).getTelEmp();break;
         case 5 : obj = ((Employe)rows.elementAt(row)).getNSecuEmp();break;
         case 6 : obj = ((Employe)rows.elementAt(row)).getDateEmbEmp();break;
         case 7 : obj = new Integer( ((Employe)rows.elementAt(row)).getMatEmp() );
        }  
     return obj;
   }      
 
Pas trés pratique !?

Reply

Marsh Posté le 03-05-2002 à 17:27:51    

Ah ouais, mais là, c'est ta structure de données qui est bof....
 
Tu devrais avoir une méthode :Object getTableField(int column) dans Employe, qui te renvoie ce qu'iol faut, mais bon, ça ne fait que déplacer ton switch...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed