2009-04-27 5 views
2

J'ai des problèmes lors de l'insertion de lignes dans un JTable et je ne sais pas quel est le problème.Valeurs répétées lors de l'insertion de lignes dans JTable

je fais exactement comme ceci:

((DefaultTableModel)myJTable.getModel()).insertRow(0,webSiteDownloader.getWebSites().toArray()); 

Le webSiteDownloader est un objet qui ont un ArrayList. Je peux obtenir ce tableau appelant la méthode getWebSites.

Le problème est que lorsque j'insère une ligne, en ajoutant la deuxième, le JTable affiche uniquement le premier, mais répété deux fois. Ai-je été assez clair?

Thks: D

Répondre

3

Je vais prendre un coup de feu dans l'obscurité et suppose que vous voulez accomplir quelque chose comme ceci:

DefaultTableModel dtm = (DefaultTableModel)myJTable.getModel(); 
for (MyRowObject row : webSiteDownloader.getWebSites()) { 
    dtm.insertRow(0, row.toArray()); 
} 

Y at-il une raison particulière que vous utilisez au lieu insertRow de addRow?

Aussi, je voudrais vraiment vous recommander de rouler votre propre TableModel à usage spécial en étendant AbstractTableModel. Exemple non testé de base:

public class MyTableModel extends AbstractTableModel 
{ 
    protected List<MyObject> rows; 

    public MyTableModel() 
    { 
    rows = new ArrayList<MyObject>(); 
    } 

    public void add(MyObject obj) 
    { 
    rows.add(obj); 
    } 

    @Override 
    public int getRowCount() 
    { 
    return rows.size(); 
    } 

    @Override 
    public int getColumnCount() 
    { 
    // This value will be constant, but generally you'd also 
    // want to override getColumnName to return column names 
    // from an array, and in that case you can return the length 
    // of the array with column names instead 
    return 2; 
    } 

    @Override 
    public Object getValueAt(int row, int column) 
    { 
    MyObject obj = rows.get(row); 

    // Change this to match your columns 
    switch(column) { 
     case 0: return obj.getId(); 
     case 1: return obj.getName(); 
    } 

    return null; 
    } 
} 
+1

Code Icky. Formatage non standard. Protégé. Manquant final. Initialisation dans un constructeur quand cela pourrait être fait sur la ligne de déclaration. Certains reviennent, d'autres non manipulés dans un commutateur. Renvoyer une valeur aléatoire ('null') au lieu de lancer une exception. @Override manquant. –

+0

Merci pour vos commentaires. Je garderai ça à l'esprit. :) –

+0

Votre TableModel ne peut pas fonctionner si vous n'appelez pas les méthodes héritées fireXxxxEvent() de AbstractTableModel! Tout appel à add() n'actualisera pas le JTable! – jfpoilpret