多列表属性的eclipse ObservableListTreeContentProvider IObservableFactory

多列表属性的eclipse ObservableListTreeContentProvider IObservableFactory,eclipse,data-binding,eclipse-rcp,viewer,Eclipse,Data Binding,Eclipse Rcp,Viewer,我想做的是使用POJO类的数据绑定创建TreeViewer,POJO类有多个列表属性,所有属性都需要观察,并显示在查看器中 我想显示一棵树,如: Person \ |- Dog // dogs list |- Dog |- Cat // cats list |- Cat |- Cat 例如: public class Cat { // ... } public class Dog { // ... } 具有两种类型的列表引用的类: public cl

我想做的是使用POJO类的数据绑定创建
TreeViewer
,POJO类有多个列表属性,所有属性都需要观察,并显示在查看器中

我想显示一棵树,如:

Person
 \
  |- Dog // dogs list
  |- Dog 
  |- Cat // cats list
  |- Cat
  |- Cat
例如:

public class Cat {
    // ...
}

public class Dog {
    // ...
}
具有两种类型的列表引用的类:

public class Person {
    private List<Dog> dogs = Lists.newArrayList();
    private List<Cat> cats = Lists.newArrayList();
    // getters and setters which fire property change listeners.
}

但是因为工厂只能返回一个IObservable,我不能同时观察猫和狗。我怎么能做到这一点呢?

对于您最初的设计,您无法做到这一点。为什么狗和猫在树的同一高度?关卡通常包含相同的对象(因为你为什么要把你的堂兄弟放在你父母的下面?)

好的,猫和狗都是动物,但是让它们扩展
Animal
类,并使用如下内容:

class Person {

  List<Animal> pets; // both dog and cats

}

IObservableFactory observableFactory = new IObservableFactory() {

    public IObservable createObservable(final Object target) {
        return BeanProperties.list("pets").observe(target);
    }
};
class PetsContentProvider immplements ITreeContentProvider {
  public boolean hasChildren(Object element) {
    if (element instanceof Person) {
      Person person = (Person) element;
      return person.getCats().size > 0 || person.getDogs().size() > 0;
    }
      return false;
  }

  public Object getParent(Object element) {
    // TODO: still better to have a common class
    if((element instanceof Dog) || (element instanceof Cat)) {
        // cast to dog or cat (or better animal)
        // Animal pet = (Animal) element;
        return pet.getOwner();
    }
    return null;
  }

  public Object[] getChildren(Object parentElement) {
    if(parentElement instanceof Person) {
        Person person = (Person) parentElement; 
        return person.getCats().toArray(); // and dogs
    }
    return EMPTY_ARRAY;
  }
}
有关更多信息,请参阅


而且是传统的。

嗨,谢谢你的回答!我的主要来源是这个例子,它几乎所有的东西都使用数据绑定(也用于导航)。我在原始问题中的示例可能不是最好的,但我确实需要在同一级别显示来自不同集合的项目。我想使用数据绑定的另一个主要原因是,我将不断地在每个级别的元素中添加和删除项,并且我希望避免手动更新它。所以没有办法做我想做的事?或者你认为在这里放弃数据绑定是个好主意吗?好吧,正如建议的,你可以对猫和狗使用公共类。此外,在没有数据绑定的情况下更新树仍然是可能的,因此我认为这是一条可行的道路。请看第一篇文章。我想会很清楚的。
class PetsContentProvider immplements ITreeContentProvider {
  public boolean hasChildren(Object element) {
    if (element instanceof Person) {
      Person person = (Person) element;
      return person.getCats().size > 0 || person.getDogs().size() > 0;
    }
      return false;
  }

  public Object getParent(Object element) {
    // TODO: still better to have a common class
    if((element instanceof Dog) || (element instanceof Cat)) {
        // cast to dog or cat (or better animal)
        // Animal pet = (Animal) element;
        return pet.getOwner();
    }
    return null;
  }

  public Object[] getChildren(Object parentElement) {
    if(parentElement instanceof Person) {
        Person person = (Person) parentElement; 
        return person.getCats().toArray(); // and dogs
    }
    return EMPTY_ARRAY;
  }
}