2012-11-03 125 views
0

我正在使用細胞樹,我有這個問題:
我通過RPC調用獲取數據。我決定一個節點是否是一片葉子 - 基於我爲孩子們獲得的數據。例如 - 如果一個節點有一個叫做「foo」的兒子 - 那麼這個節點應該是一個葉子。
我不知道如何讓這個節點成爲一片葉子,而不是在樹上展示它的子節點。 (相反,我想在點擊節點時將它們展示給其他地方)
可能嗎?有人有想法嗎?
請幫助我,我堅持了2天...
謝謝!GWT細胞樹 - 葉節點

回答

0

您可以重寫isLeaf()方法來返回true或false。

但是,從UI的角度來看,會有一個問題。在用戶點擊一個節點之前,你不知道這應該是一個節點還是一個葉子。這有點令人困惑,雖然我多次看到這樣的實現。如果你的樹不是很大,可以考慮一次加載所有數據,然後按照你想要的方式構建它 - 根據需要創建節點或葉子。

+0

我得到了孩子們的節點USI ng AsyncDataProvider。在getNodeInfo()中我創建了一個新的數據提供者實例。在數據提供者的onRangeChanged()中,我調用回調方法,並在其onSuccess方法中更新數據。我可以檢查onSuccess的結果 - 如果它有「foo」,然後返回Null,意味着這個節點沒有子節點,但是當點擊節點時它會拋出一個Null異常。現在,如果我不返回空 - 那麼它會顯示孩子。而且我無法找到一種方法來檢查CustomTreeModel中的孩子! – user1579191

+0

我按照這些詳細信息更改了我的答案。 –

+0

我的樹很大,所以我無法一次加載所有的數據。我沒有看到我在這裏如何使用isLeaf方法。我該如何檢查這個方法的dataProvider列表?對列表值的唯一訪問來自我在創建單元時實現的render()方法,但我不明白它如何幫助我。謝謝你的幫助! – user1579191

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; 
} 
} 
} 
+0

那麼,我的問題是,我不知道如果一個特定的節點將成爲父母或不是。我可以在同一級別擁有2個相同類型的節點,點擊它們後 - 兩個節點都有子級列表,但其中一個列表將包含單詞「foo」(例如),因此我希望它的父母是葉子,當點擊這個葉節點時 - 看到屏幕上其他地方的孩子列表。但我現在明白這是不可能的,因爲當點擊這兩個節點的父節點時,它應該已經清楚它們是否是樹葉(對於打開的圖標)。 – user1579191