Через некоторое время я наконец получил это. Я закончил тем, что создал свой собственный RPC, который будет обслуживать массив строк, которые будут представлять имена всех TreeNodes для следующего уровня.
Таким образом, точка входа будет:
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
}
Серверный сервер на стороне сервера создает запрос, выполняет его, затем преобразует ResultSet в массив строк и передает его обратно. Все, что нужно сделать обратному вызову, обратно на стороне клиента, - это преобразовать этот массив в массив TreeNodes и прикрепить их к исходному Node, по которому щелкнули. Наконец, после всего этого элемент GUI перерисовывается с новыми узлами.
Я был удивлен, что было очень мало времени простоя между нагрузками на узлы (менее 1 секунды), даже когда иногда отображалось около сотни узлов, где запрашивался запрос.