Java Gwt CellTree isLeaf()问题

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

我试图显示一个类别树,下面是基本的CellTree gwt示例

我要做的是确定一个类别的叶子状态

当一个类别没有子类别时,它就是一片叶子,对吗?下面是我使用Objectify进行appengine持久化的类别:

@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。我编辑了我的答案,以提供更完整的代码示例。