首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现TreeModel

实现TreeModel
EN

Stack Overflow用户
提问于 2012-07-22 08:29:31
回答 2查看 4.4K关注 0票数 2

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

代码语言:javascript
复制
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....

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

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-22 08:40:25

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

票数 4
EN

Stack Overflow用户

发布于 2012-07-22 09:14:01

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

如果你真的需要实现TreeModelFileTreeModel,讨论过的here,是一个相当容易理解的例子。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11596888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档