2012-11-03 4 views
0

내가 셀 트리를 사용하고 있는데 나는이 문제를 가지고 :
나는 RPC 호출을 통해 데이터를 얻을. 노드가 리프인지 아닌지를 결정합니다. 그 노드에 대한 데이터를 기반으로합니다. 예를 들어 - 노드에 "foo"라는 아들이 있으면이 노드는 잎이어야합니다.
이 노드를 리프가되게하고 트리에 자식을 표시하지 않는 방법을 모르겠습니다. (대신 노드를 클릭 할 때 다른 곳에 보여주고 싶습니다.)
가능합니까? 누구나 아이디어가 있습니까?
내가 ...
감사 2 일간 그것으로 붙어있어, 제발 도와주세요!GWT 셀 나무 - 잎 노드

답변

0

당신은 true 또는 false를 돌려 isLeaf() 메소드를 오버라이드 (override) 할 수 있습니다.

은 UI 관점에서, 그러나, 문제가있을 수 있습니다. 사용자가 노드를 클릭하기 전에 노드 또는 리프인지 여부를 알 수 없습니다. 이것은 다소 혼란 스럽지만, 그러한 구현을 두 번 이상 보았습니다. 트리가 너무 크지 않은 경우 모든 데이터를 한 번에로드 한 다음 필요한 방식으로 노드를 작성하거나 필요에 따라 리프를 작성하십시오.

+0

나는 노드 USI의 아이를 얻을 AsyncDataProvider. getNodeInfo()에서 데이터 공급자의 새 인스턴스를 만들고 있습니다. 데이터 공급자의 onRangeChanged()에서 콜백 메서드를 호출하고 onSuccess 메서드에서 데이터를 업데이트합니다. onSuccess의 결과를 검사 할 수 있습니다. "foo"가 있고 Null을 반환하면이 노드에 자식이 없지만 노드를 클릭하면 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

글쎄, 내 문제는 특정 노드가 부모가 될 것인지 아닌지 미리 알 수 없다는 것입니다. 동일한 유형의 두 노드를 같은 레벨에서 가질 수 있습니다. 노드를 클릭하면 둘 다 자식 목록을 갖지만 목록 중 하나에는 "foo"라는 단어가 포함되므로 (예 :) 부모가 잎이 될 때, 그리고이 잎 노드를 클릭 할 때 화면의 어딘가에있는 자식 목록을 볼 수 있습니다. 그러나 이것이 가능하지 않다는 것을 알았습니다. 두 노드의 부모를 클릭 할 때 - 나뭇잎인지 아닌지 (열려있는 아이콘의 경우) 이미 명확해야합니다. – user1579191