0

我正在使用单元格树,但遇到了这个问题:
我通过 RPC 调用获取数据。我决定一个节点是否是叶子 - 基于我为其子节点获得的数据。例如——如果一个节点有一个叫做“foo”的儿子——那么这个节点应该是一个叶子。
我不知道如何使这个节点成为叶子而不是在树上显示它的子节点。(相反,我想在其他地方显示它们,单击节点时)
有可能吗?有人有想法吗?
请帮助我,我坚持了 2 天......
谢谢!

4

2 回答 2

0

您可以覆盖 isLeaf() 方法以返回 true 或 false。

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

于 2012-11-04T03:44:37.093 回答
0

如果每个节点都有一个类型,您能否创建一些类型列表或映射,这些类型在您的 TreeViewModel impl 中不应该有子节点?

在一个 impl 中,我对所有类型都使用了元模型,但这不是必需的。

例如,

@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;
}
}
}
于 2012-11-04T15:59:16.363 回答