Gwt CellTree isLeaf()问题

时间:2011-08-22 15:50:07

标签: java gwt tree cell objectify

我正在尝试按照基本的CellTree gwt示例显示类别树。

我坚持的是确定类别的“叶子”状况。

当它没有孩子时,它是“a-a-leaf”,对吧?所以,这是我的类别(我使用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;
    }
}

我的TreeViewModel基于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());
            }
        });
    }

问题是:因为我的Category bean上没有“叶子属性”,我怎么知道它是否有孩子?通过明显地进行查询,但isLeaf方法需要同步返回,如何进行rpc调用?

或者我可以在getCategorie()调用中检索“leaf”信息,在运行时填充属性,但这可能是性能问题。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

我会在Categoria类中添加一个瞬态属性,boolean isLeaf,然后在setParent方法中,您可以将父级的isLeaf属性设置为false(因为如果{{1}对象的父级为this,然后that对象不是叶子)。使属性瞬态意味着它不会被持久化,因此您不必担心在数据模型中使用该字段。

编辑:以下是我对that班级的Categoria方法进行编码的方法......

setParent

这样,一旦你建立了public void setParent(Key<Categoria> parent) { this.parent = parent; parent.setIsLeaf(false); } 节点的模型,每个节点都会知道它是否是一片叶子。这是有效的,因为如果Categoria作为孩子有parent,则this不可能是一片叶子。将parent属性默认为isLeaf,您只需检查其属性即可知道任何给定的true是否为叶子。