多列表属性的eclipse ObservableListTreeContentProvider IObservableFactory
我想做的是使用POJO类的数据绑定创建多列表属性的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
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;
}
}