GWT单元树-叶节点

GWT单元树-叶节点,gwt,gwt-rpc,Gwt,Gwt Rpc,我使用的是一个单元树,我有一个问题: 我通过RPC调用获取数据。我根据为其子节点获取的数据来决定节点是否为叶节点。例如,如果一个节点有一个名为“foo”的子节点,那么这个节点应该是一个叶子。 我不知道如何使这个节点成为叶子,而不在树上显示它的子节点。(相反,当单击节点时,我想在其他地方显示它们) 可能吗?有人有想法吗? 请帮帮我,我被困了两天… 谢谢 您可以重写isLeaf()方法以返回true或false 但是,从UI的角度来看,会有一个问题。在用户单击某个节点之前,您不知道该节点是节点还是叶

我使用的是一个单元树,我有一个问题:
我通过RPC调用获取数据。我根据为其子节点获取的数据来决定节点是否为叶节点。例如,如果一个节点有一个名为“foo”的子节点,那么这个节点应该是一个叶子。
我不知道如何使这个节点成为叶子,而不在树上显示它的子节点。(相反,当单击节点时,我想在其他地方显示它们)
可能吗?有人有想法吗?
请帮帮我,我被困了两天…
谢谢

您可以重写isLeaf()方法以返回true或false


但是,从UI的角度来看,会有一个问题。在用户单击某个节点之前,您不知道该节点是节点还是叶子。这有点令人困惑,尽管我不止一次看到过这样的实现。如果您的树不是很大,请考虑立即加载所有数据,然后按照需要创建它——根据需要创建节点或叶。

< P>如果每个节点都有一个类型,您可以创建一些在您的TeeVIEWMIDIMPL?

中不期望有子类型的列表或映射吗? 在impl中,我对所有类型使用了元模型,但这不是一个要求

例如:

}

//为根节点创建数据提供程序
受保护的ListDataProvider getDataProvider(集合根节点){
返回新的ListDataProvider(新的LinkedList(rootNodes));
}

//创建包含直接子体的数据提供程序。
受保护的AsyncDataProvider getDataProvider(最终NavNode节点){
返回新的AsyncDataProvider(){
@凌驾
受保护的无效onRangeChanged(最终数据显示){
最终设置clientNodes=util.getAncestorNodes(节点);
clientNodes.add(节点);
final NavigationInfo clientInfo=新的NavigationInfo(clientNodes);
GetNavigationService.getNavInfo(客户端信息、节点、资源、资格、新的安全操作回调(eventBus、false){
@凌驾
失效时的公共无效执行(可丢弃捕获){
log(“检索“+node.getName(),捕获的子节点时出错”);
updateRowCount(0,false);
}
@凌驾
成功实施时的公共无效(操作结果或){
util.mergeNavInfo(或.getResult());
final NavNode nodeFromServer=util.getNode(node.getId());
最终范围=display.getVisibleRange();
final int start=range.getStart();
最终设置节点=util.getNodes(nodeFromServer.getChildren());
updateRowData(显示、启动、新链接列表(节点));
}
});
}
};
}

私有静态类节点帮助器{
私有静态最终设置父节点类型;
静止的{
父节点类型=新哈希集();
父节点类型。添加(节点类型。资产所有者);
家长节点类型。添加(节点类型。工作日);
父节点类型。添加(节点类型。资源);
父节点类型。添加(节点类型。资源);
父节点类型。添加(节点类型。能量);
父节点类型。添加(节点类型。保留);
家长\节点\类型。添加(节点类型。前一天\已清除\提供);
父节点类型。添加(节点类型。DRR\u加载\u预测);
父节点类型。添加(节点类型。保留调度);
父节点类型。添加(节点类型。保留爬坡率);
}
公共静态布尔值couldHaveChildren(NodeType NodeType){
布尔结果=假;
if(父节点类型包含(节点类型)){
结果=真;
}
返回结果;
}
}
}

我使用AsyncDataProvider获取节点的子节点。在getNodeInfo()中,我正在创建数据提供程序的一个新实例。在数据提供程序的onRangeChanged()中,我调用回调方法,并在其onSuccess方法中更新数据。我可以检查onSuccess的结果——如果它有“foo”,然后返回Null,这意味着这个节点没有子节点,但是当单击该节点时,它抛出一个Null异常。现在,如果我不返回Null,那么它会显示孩子们。我找不到一种方法来检查CustomTreeModel中的孩子们!我根据这些细节修改了答案。我的树非常大,所以我不能一次加载所有数据。我不知道如何在这里使用isLeaf方法。如何在此方法中签入数据提供程序的列表?对列表值的唯一访问是从我在创建单元格时实现的render()方法,但我看不出它有什么帮助。谢谢你的帮助!我的问题是,我事先不知道某个特定节点是否是父节点。我可以有两个相同类型、相同级别的节点,单击它们后,它们都将有子节点列表,但其中一个列表将包含单词“foo”(例如),因此我希望它的父节点是一个叶节点,当单击此叶节点时,可以在屏幕上的其他地方看到它的子节点列表。但我现在明白这是不可能的,因为当单击这两个节点的父节点时,应该已经很清楚它们是否是叶子(对于打开的图标)。
@Override
public boolean isLeaf(Object value) {
boolean result = true;
if (value == null) {
    result = false;  // assumes all root nodes have children
} else if (value instanceof NavNode) {
    final NavNode currentNode = (NavNode) value;
    final NodeType currentNodeType = NodeType.fromValue(currentNode.getType());
    if (currentNode.hasChildren() || NodeHelper.couldHaveChildren(currentNodeType)) {
        result = false;
    }
}
return result;
// Create a data provider for root nodes
protected ListDataProvider<NavNode> getDataProvider(Collection<NavNode> rootNodes) {
return new ListDataProvider<NavNode>(new LinkedList<NavNode>(rootNodes));
// Create a data provider that contains the    immediate descendants.
protected AsyncDataProvider<NavNode> getDataProvider(final NavNode node) {
return new AsyncDataProvider<NavNode>() {
    @Override
    protected void onRangeChanged(final HasData<NavNode> display) {
        final Set<NavNode> clientNodes = util.getAncestorNodes(node);
        clientNodes.add(node);
        final NavigationInfo clientInfo = new NavigationInfo(clientNodes);
        navigationService.getNavInfo(clientInfo, node, resources, qualifications, new SafeOperationCallback<NavigationInfo>(eventBus, false) {

            @Override
            public void onFailureImpl(Throwable caught) {
                GWT.log("Something went wrong retreiving children for " + node.getName(), caught);
                updateRowCount(0, false);
            }

            @Override
            public void onSuccessImpl(OperationResult<NavigationInfo> or) {
                util.mergeNavInfo(or.getResult());
                final NavNode nodeFromServer = util.getNode(node.getId());
                final Range range = display.getVisibleRange();
                final int start = range.getStart();
                final Set<NavNode> nodes = util.getNodes(nodeFromServer.getChildren());
                updateRowData(display, start, new LinkedList<NavNode>(nodes));
            }

        });

    }
};
private static class NodeHelper {

private static final Set<NodeType> PARENTAL_NODE_TYPES;

static {
    PARENTAL_NODE_TYPES = new HashSet<NodeType>();
    PARENTAL_NODE_TYPES.add(NodeType.ASSET_OWNER);
    PARENTAL_NODE_TYPES.add(NodeType.OPERATING_DAY);
    PARENTAL_NODE_TYPES.add(NodeType.RESOURCES);
    PARENTAL_NODE_TYPES.add(NodeType.RESOURCE);
    PARENTAL_NODE_TYPES.add(NodeType.ENERGY);
    PARENTAL_NODE_TYPES.add(NodeType.RESERVE);
    PARENTAL_NODE_TYPES.add(NodeType.DAY_AHEAD_CLEARED_OFFERS);
    PARENTAL_NODE_TYPES.add(NodeType.DRR_LOAD_FORCAST);
    PARENTAL_NODE_TYPES.add(NodeType.RESERVE_DISPATCH);
    PARENTAL_NODE_TYPES.add(NodeType.RESERVE_RAMP_RATE);
}

public static boolean couldHaveChildren(NodeType nodeType) {
    boolean result = false;
    if (PARENTAL_NODE_TYPES.contains(nodeType)) {
        result = true;
    }
    return result;
}
}
}