Java Gwt CellTree isLeaf()问题
我试图显示一个类别树,下面是基本的CellTree gwt示例 我要做的是确定一个类别的叶子状态 当一个类别没有子类别时,它就是一片叶子,对吗?下面是我使用Objectify进行appengine持久化的类别:Java Gwt CellTree isLeaf()问题,java,gwt,tree,cell,objectify,Java,Gwt,Tree,Cell,Objectify,我试图显示一个类别树,下面是基本的CellTree gwt示例 我要做的是确定一个类别的叶子状态 当一个类别没有子类别时,它就是一片叶子,对吗?下面是我使用Objectify进行appengine持久化的类别: @Entity public class Categoria implements Serializable { private static final long serialVersionUID = 1L; @Id Long id; String
@Entity
public class Categoria implements Serializable {
private static final long serialVersionUID = 1L;
@Id
Long id;
String nome;
Key<Categoria> parent;
public Categoria() { }
public Categoria(String nome) {
super();
this.nome = nome;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Key<Categoria> getParent() {
return parent;
}
public void setParent(Key<Categoria> parent) {
this.parent = parent;
}
}
我的TreeView模型基于我从外部传递的AsyncDataProvider:
public class CategorieTreeViewModel implements TreeViewModel {
private AbstractDataProvider<Categoria> dataProvider;
public CategorieTreeViewModel(AbstractDataProvider<Categoria> dataProvider) {
this.dataProvider = dataProvider;
}
@Override
public <T> NodeInfo<?> getNodeInfo(T value) {
return new DefaultNodeInfo<Categoria>(dataProvider, new CategoriaCell());
}
@Override
public boolean isLeaf(Object value) {
return false;
}
}
这就是:
dataProvider = new AsyncDataProvider<Categoria>() {
@Override
protected void onRangeChanged(HasData<Categoria> display) {
updateTree();
}
};
private void updateTree() {
rpcService.getCategorie(new AsyncCallback<Categoria[]>() {
@Override
public void onSuccess(Categoria[] result) {
dataProvider.updateRowCount(result.length, true);
dataProvider.updateRowData(0, Arrays.asList(result));
}
@Override
public void onFailure(Throwable caught) {
Window.alert(caught.toString());
}
});
}
问题是:既然我的分类bean上没有叶属性,我怎么知道它是否有子级呢?显然,通过执行查询,但isLeaf方法需要同步返回,如何进行rpc调用
或者我可以在getCategory调用中检索该叶信息,在运行时填充属性,但这可能是一个性能问题
我能做什么?我会向Categoria类添加一个临时属性,一个布尔isLeaf,然后在setParent方法中,您可以将父对象的isLeaf属性设置为false,因为如果此对象有其父对象,则该对象不是叶。使属性暂时化意味着它不会被持久化,因此您不必担心数据模型中有该字段 编辑:下面是我如何编写Categoria类的setParent方法的代码
public void setParent(Key<Categoria> parent) {
this.parent = parent;
parent.setIsLeaf(false);
}
这样,一旦建立了Categoria节点的模型,每个节点都知道它是否是一个叶。这是因为如果父对象将其作为子对象,则父对象不可能是叶。将isLeaf属性默认为true,只需检查它的属性,就可以知道任何给定的Categoria是否为叶。最后,我这样做了。下一个问题可能是在哪里设置各种isLeaf标志!好在我的getCategorie rpc方法中:-我检索所有类别-我循环每个类别并查询儿童-我将leaf设置为true或false。不正式,不是吗?您认为如何改进?@Fabio B。我编辑了我的答案,以提供更完整的代码示例。