2010-11-20 5 views
1

J'ai cette classe:Comment représenter une classe complexe dans un AbstractTableModel?

public abstract class Directory { 

    protected int id; 
    protected File path; 
    protected LinkedList<Filter> filters; 
    protected LinkedList<File> files; 
    protected int wildcard; 
    public static int numCols = 3; 

    /* other things */ 
} 

Et j'ai écrit ce modèle de table:

public class DirectoryListTableModel extends AbstractTableModel { 

    private static final long serialVersionUID = 1L; 
    private LinkedList<Directory> datalist; 
    private String[] columnNames= {"ID", "Directory", "Wildcard", "Filters"}; 


    public DirectoryListTableModel(){ 
    } 

    public void setDatalist(LinkedList<Directory> temp){ 
     this.datalist = temp; 
    } 

    public void showElement(){ 
     fireTableRowsInserted(this.datalist.size()-2,this.datalist.size()-2); 
    } 

    public LinkedList<Directory> getDatalist(){ 
     return (LinkedList<Directory>) this.datalist.clone(); 
    } 

    @Override 
    public String getColumnName(int column) { 
     return this.columnNames[column];  
    } 

    @Override 
    public int getColumnCount() { 
     return Directory.numCols; 
    } 

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

    @Override 
    public Object getValueAt(int row, int col) { 

     Directory temp = this.datalist.get(row); 

     switch(col){ 
     case 0: 
      return temp.getId(); 
     case 1: 
      return temp.getPath(); 
     case 2: 
      return temp.getWildcard(); 
     default: 
      return null;   
     } 
    } 
} 

Comme vous pouvez le voir, j'ai un LinkedList<Filter> que je voudrais aussi montrer en tant que chaîne simple. Comment puis je faire ça?

Répondre

2

par exemple:

case 3: 
    return temp.getFilters().toString(); 

Note:

  • Utilisez l'interface (par exemple la liste) plutôt que la mise en œuvre (LinkedList) lors de la déclaration des champs (si vous n'avez pas une bonne raison de le faire autrement).
  • ArrayList a une meilleure performance que LinkedList dans la plupart des cas (par exemple, comme l'accès par index)
  • surchargeons aussi getColumnClass
  • Gardez vos champs privés
  • setDatalist: fireTableDataChanged
+0

Tout d'abord, merci toi. J'ai besoin de protéger mes champs parce que c'est un cours abstrait. Comment substituer getColumnClass? Je veux dire: devrais-je retourner String.class si columnindex = 3? Ou LinkedList.class? – dierre

+0

Ensuite, fournissez des getters protégés (et des setters si nécessaire) Quoi que getValueAt renvoie, alors String.class dans ce cas. – Puce

+0

J'utilise des getters et des setters. Ils sont simplement laissés de côté parce que cette classe est vraiment longue. – dierre