JTable [JAVA] - Java - Programmation
Marsh Posté le 01-05-2002 à 18:17:53
try {
}
catch (NullpointerException npe) {
}
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 ?
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()
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(...)
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.
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();
}
...
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!!
Et n'aie pas honte, je me suis fait avoir aussi au début (et même pas qu'au début!)
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
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 !?
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 bject getTableField(int column) dans Employe, qui te renvoie ce qu'iol faut, mais bon, ça ne fait que déplacer ton switch...
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 ?