过了一会儿,我终于明白了。我最终创建了自己的 RPC,该 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 创建查询,执行,然后将 ResultSet 转换为字符串数组并将其传回。回到客户端,回调所要做的就是将该数组转换为 TreeNode 数组,并将它们附加到单击的原始节点。最后,在所有这些之后,使用新节点重新绘制 GUI 元素。
我很惊讶节点加载之间的停机时间非常短(少于 1 秒),即使有时有一百个左右的节点被查询然后显示。