我正在学习在GWT中设计GUI 我有RootPanel,我把所有的小部件都放在了。
在一个面板中,我已将树Widget放在其中,在selectionHandler上的RPC调用成功时添加了treeItems
我想做什么: 单击treemItem时,不应选择所有其他treeItem和同一面板上的小部件。就像正在进行处理一样,所以不允许其他任何事情发生。
请提出一些想法或示例代码或示例。
答案 0 :(得分:4)
如果我正确理解您,您希望禁用用户单击某些小部件,直到特定回调结束。为此,您应该拥有一个更大z-index
和opacity
的自定义面板。例如,类似于DialogBox
的{{1}}方法,并尝试在回调中使用该技术。当异步请求开始显示setGlassEnabled(true)
和onSuccess
中的面板时,您应该隐藏它。顺便说一句,my-gwt有LoadingPanel类来实现这样的功能。还有GWT-Ext中的另一个mask现场演示。
答案 1 :(得分:1)
这句话是多余的,不必要的:
“单击treemItem时,所有其他treeItem和小部件都打开 不应该选择相同和不同的面板。“
当然,当您单击树节点时,这是您要激活的唯一节点。没有其他节点会有任何活动。按照惯例。
我真的不知道这句话到底是什么:
“就像正在进行处理一样,所以不允许其他任何事情发生 做“。
您的问题应该只是:
如何将子节点添加到树窗口小部件中,其中添加了子节点 只有当我点击节点时?当我点击一个节点时,如果它没有 子节点,将触发RPC以获取节点。应该怎样 我的RPC结果更新节点?点击节点后,它应该是 突出显示。整个树上应该只有一个突出显示/选定的节点。
扩展HorizontalPanel以包含图标和标题。 它应该实现IsTreeItem。 它应该实现ClickHandler,以便它可以作为clickhandler添加到图标和标题标签。
public class Node
extends HorizontalPanel
implements ClickHandler, IsTreeItem{
Image img;
Label label;
MyData data;
TreeItem nodeWrapper;
构造函数在MyData记录中进行操作,实例化图标图像和标题标签,并将自身关联为图标和标签的clickhandler:
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 ...
}
假设您有一个分屏。左侧是树小部件,右侧面板是某种显示。因此,除了触发RPC提取之外,onclick还会调用displayRightPanel(数据),并且由您决定如何显示该数据。
您将创建第一个根节点并将其关联为树的根,并且用户单击将填充树的其余部分。因此,根节点将要求您编写一个MyData记录,该记录将提供iconUrl,title和一些根数据。
树窗口小部件将管理其成员的突出显示,并确保只突出显示一个成员。