Implementing TreeModel



我正在尝试编写一个实现TreeModel类的类。我希望有人能指引我走向正确的方向。下面是我的课。问题是,当我将它绑定到jTree组件时,第二个级别不断被添加。所以我怀疑我对父对象的引用是错误的:

public class PMEntry implements TreeModel{
private String title;
private List<PMEntry> pmEntryCollection;
private String pmId;
private String href;
private PMEntry root;
private ModuleType type;
public PMEntry (PMEntry root){
  this.root = root;
}
@Override
public Object getRoot() {        
   return ((PMEntry)this.root);
}
@Override
public Object getChild(Object o, int i) {

    if(getPmEntryCollection().isEmpty()){
        return null;
    }else {
      return (PMEntry) getPmEntryCollection().get(i);
    }
}
@Override
public int getChildCount(Object o) {
   if(getPmEntryCollection().isEmpty()){
        return 0;
    }else {
      return getPmEntryCollection().size();
    }
}
@Override
public boolean isLeaf(Object o) {
    PMEntry pmentry = (PMEntry)o;
    return (pmentry.getType() == ModuleType.DM) ? true : false;
 }
@Override
public void valueForPathChanged(TreePath tp, Object o) {
   //todo
}
@Override
public int getIndexOfChild(Object parent, Object child) {
    if (!(parent instanceof PMEntry)){
        System.out.println("Returning -1");
        return -1;
    }           
    PMEntry pParent = (PMEntry) parent;
    List<PMEntry> children = pParent.getPmEntryCollection();
    if (children == null) {
        System.out.println("children = null, Returning -1");
        return -1;
    }
    for (int i = 0; i < children.size(); i++) {
        System.out.println("Child:" + child);
        if (children.get(i) == child) {
            return i;
        }
    }
    return -1;        
}
@Override
public void addTreeModelListener(TreeModelListener tl) {
   //todo
}
@Override
public void removeTreeModelListener(TreeModelListener tl) {
    //todo
}
@Override
public String toString(){
    return this.getTitle();
}
public enum ModuleType {
    PM,
    DM
}
// getters and setters here....

下面是我如何绑定数据的片段

PMEntry tm = new PMEntry(null);
tm.setTitle("Root");
PMEntry pmRoot = new PMEntry((PMEntry)(tm));
pmRoot.setTitle("Project");
PMEntry pm1 = new PMEntry(pmRoot);
pm1.setType(PMEntry.ModuleType.DM);
pm1.setTitle("Publication Module");
PMEntry pm2 = new PMEntry(pmRoot);
pm2.setType(PMEntry.ModuleType.PM);
pm2.setTitle("Chapter");     
List<PMEntry> pmCollection = new ArrayList<PMEntry>();      
List<PMEntry> pmCollection1 = new ArrayList<PMEntry>();
PMEntry pm3 = new PMEntry(null);
pm3.setType(PMEntry.ModuleType.DM);
pm3.setTitle("Data Module");
PMEntry pm4 = new PMEntry(null);
pm4.setType(PMEntry.ModuleType.DM);
pm4.setTitle("Data Module");
pmCollection1.add(pm3);
pmCollection1.add(pm4); 
pm2.setPmEntryCollection(pmCollection1);
pmCollection.add(pm1);
pmCollection.add(pm2);                     
pmRoot.setPmEntryCollection(pmCollection);
this.jTree1.setModel(pmRoot);

我想知道您为什么认为需要实现TreeModel。你调查过DefaultTreeModel吗?除了该类之外,您还计划实现哪些新行为?

我不得不同意@duffymo&HFOE:不要过早拒绝DefaultTreeModel。这里有一个示例说明了用于编辑userObjectnameTreeCellEditor

如果您确实需要实现TreeModel,这里讨论的FileTreeModel是一个非常容易访问的示例。

相关内容

  • 没有找到相关文章

最新更新