这句话是多余的,不必要的:
"当点击 treemItem 时,所有其他 treeItem 和小部件
不应选择相同和不同的面板。”
当然,当您单击一个树节点时,这是您想要激活的唯一节点。没有其他节点有任何活动。这是约定俗成的。
而且我真的不知道这句话是什么意思:
“就像正在进行一个处理,所以不允许其他事情发生
做。”
您的问题应该是:
如何将子节点添加到添加子节点的树小部件
只有当我点击节点?当我点击一个节点时,如果它没有
子节点,将触发 RPC 来获取节点。应该怎样
我的 RPC 结果更新节点?在我点击一个节点后,它应该是
突出显示。整棵树上应该只有一个突出显示/选定的节点。
扩展 HorizontalPanel 以包含图标和标题。
它应该实现 IsTreeItem。
它应该实现 ClickHandler 以便它可以作为点击处理程序添加到图标和标题标签。
public class Node
extends HorizontalPanel
implements ClickHandler, IsTreeItem{
Image img;
Label label;
MyData data;
TreeItem nodeWrapper;
构造函数吃入 MyData 记录,实例化图标图像和标题标签,并将自身关联为图标和标签的点击处理程序:
public Node(MyData data){
this.nodeWrapper = new TreeItem(this);
this.img = new Image(data.getIconUrl());
this.label = new Label(data.getTitle());
this.data = data;
this.add(img);
this.add(this.label);
// ensure onclick is triggered either by clicking img or label.
this.img.addClickHandler(this);
this.label.addClickHandler(this);
}
实现 IsTreeItem 需要节点能够用 TreeItem 来证实自己:
public TreeItem asTreeItem(){
return this.nodeWrapper;
}
点击处理将获取子记录列表并从子记录迭代地创建新节点并将它们附加到当前节点。这是 RPC 回调操作发生的地方。
public void onClick(ClickEvent e){
this.displayRightPanel(this.data);
if(this.nodeWrapper.getChildCount()==0)
fetchNodeData(
this.nodeWrapper,
this.data.getId(),
new AsyncCallBack<List<MyData>>(){
public void onSuccess(List<MyData> nodeDataList){
for(MyData nodeData : nodeDataList){
Node.this.nodeWrapper.addItem(new Node(nodeData));
}
}
public void onFailure(Throwable sorry){
doWhatever();
}
}
);
}
在关闭类定义之前定义其他相关方法:
//blah ... blah ... blah...
}
由于这不是关于 RPC 的教程,您应该了解如何编写 RPC 部分。您需要定义 MyData,它是 GWT 客户端和 RPC servlet 之间的共享 POJO。 RPC servlet 必须返回一个 MyData 列表。您需要至少了解数据库规范化的第二范式,才能理解为什么需要 getId() 方法。
public Interface MyData{
String getIconURL();
String getTitle();
String getId();
// among others ...
}
假设您有一个拆分面板。左侧是树小部件,右侧面板是某种显示。因此,onclick 除了触发 RPC 获取之外,还会调用 displayRightPanel(data),而您希望如何显示该数据。
您将创建第一个根节点并将其关联为树的根,而树的其余部分将通过用户单击来填充。因此,根节点需要您编写一个 MyData 记录,该记录将提供 iconUrl、标题和一些根数据。
树小部件将管理其成员的突出显示并确保仅突出显示一个成员。