過了一會兒,我終於明白了。我最終創建了自己的RPC,它將提供一個字符串數組,用於表示下一級別的所有TreeNode的名稱。
所以入口點是:
private NodeServiceAsync nodesRpc; //The RPC that grabs more nodes
private Tree data; //The data structure to hold all of the nodes
private ColumnTree list; //The GUI element that is shown on in the browser
public void onModuleLoad() {
nodesRpc = (NodeServiceAsync) GWT.create(NodeService.class);
data = new Tree();
list = new ColumnTree;
list.setAutoFetchData(true);
list.setLoadDataOnDemand(true);
list.addNodeSelectedHandler(new NodeSelectedHandler() {
public void onNodeSelected(NodeSelectedEvent event) {
if(/*Node is folder and hasn't been opened before*/) {
//Get More Nodes
AsyncCallback<String[]> callback = new NodeGetter<String[]>();
nodesRpc.getData(event.getNode(), callback);
}
else if(/*Node is not a folder (at the end) */) {
//Do something else
}
}
});
list.setData(data); //Make the GUI Element Represent The Data Structure
RootPanel.get().add(list); //Add to screen
}
在服務器側的serverlet創建查詢,執行,然後轉換該結果集成一個字符串數組並傳遞回來。所有的回調都需要做,回到客戶端,將該數組翻譯成TreeNodes數組,並將它們附加到被單擊的原始節點上。最後,在所有這些GUI元素都重新繪製新節點。
我很驚訝節點負載(小於1秒)之間的停機時間非常短,即使有時會有一百多個節點被查詢然後顯示。