2010-04-13 54 views
1

在我的GWT项目中,我试图获取它,因此两个DialogBoxes可以在对方之间传递信息。其中一个包含MapWidget,当在另一个DialogBox中按下按钮时,位置信息从另一个DialogBox的MapWidget中接收。有没有人有任何提示,我应该如何协调两个不同的DialogBoxes出现?我是否应该将两者的代码包装在Composite中?此外,GWT中有没有一个例子可以同时处理两个对话框?例如,如果我点击两个框外,都应该被解雇。我想知道是否有办法让他们一次都集中注意力,所以我可以在两者之间切换而不会导致消失。在GWT中连接两个对话框

回答

1

共享对话框之间数据

在我看来,“正确”的方式做,这将是实现在应用某种MVP structure使演示管理视图(DialogBox ES,中其他的东西),并知道如何将简单的数据传递给视图来显示(演示者将处理MapWidget数据,该视图将负责将其显示在DOM上)。

不过,如果你正在寻找一个更快/更简单的方法,你有两个选择(你选择真的取决于应用程序结构):

  1. 创建Composite,正如你所提到,知道如何来回传递必要的数据。通过让Composite管理数据对象并告诉两个DialogBox如何显示它,您实际上正在接近您的Composite中的MVP体系结构。
  2. 子类DialogBox转换为包含HandlerManager(有时用作“事件总线”)的类,该按钮在按下按钮时触发事件。您可以创建旨在在两个DialogBox es之间来回传递数据的事件(即使使用类型参数使它们类型安全)。有关使用HandlerManager的详细信息,请参阅this StackOverflow question。上面链接的MVP文章也有一些good information on using an event bus

Model-View-Presenter是一种经过实践验证的构建应用程序的方法,可以生成更多可测试的代码,更好的项目结构,并且可以在做出这样的决策时为您提供指导。我强烈建议您检查一下,如果你还没有。

共享自动隐藏功能

GWT的​​(上DialogBox的原型)提供了一个方法addAutoHidePartner(Element)这也是正是如此描述:一个自动隐藏的合作伙伴中出现不会隐藏

鼠标事件面板设置为自动隐藏。

所以,你只能创建接近当你点击之外他们两个两个自动隐藏DialogBox ES(例如,他们没有当您在任的箱子点击关闭),用下面的代码:

// Create the dialog boxes 
DialogBox dbox1 = new DialogBox(true, false); 
DialogBox dbox2 = new DialogBox(true, false); 
// Set some visual options 
dbox1.setPopupPosition(10, 10); 
dbox2.setPopupPosition(200, 10); 
dbox1.setAnimationEnabled(true); 
dbox2.setAnimationEnabled(false); 
// Set the dialog boxes' caption and content 
dbox1.setHTML("Dialog Box 1"); 
dbox2.setHTML("Dialog Box 2"); 
dbox1.setWidget(new HTML("This is the first dialog box.")); 
dbox2.setWidget(new HTML("This is the second dialog box.")); 
// Making dobx2 a partner of dbox1 means clicking 
// in dbox2 won't cause dbox1 to close 
dbox1.addAutoHidePartner(dbox2.getElement()); 
// Similarly, setting dbox1 as a partner of dbox2 means 
// clicking in dbox1 won't cause dbox2 to close 
dbox2.addAutoHidePartner(dbox1.getElement()); 
// Show the dialog boxes 
dbox1.show(); 
dbox2.show(); 

您可以与其中任一个对话框进行交互,而无需其他关闭。如果您只想要单向合作伙伴关系,请忽略拨打setAutoHidePartner的适当电话。

+0

非常感谢,它的工作原理!唯一的问题是,似乎我无法为两个对话框都设置setGlassEnabled(true)。好吧。 – 2010-04-26 17:28:15

+0

很高兴听到它!你可以考虑重载'show()'来检查是否显示另一个'DialogBox'并且启用了玻璃,并且在调用父'show()'之前以编程方式设置玻璃的启用状态。这将允许您在任何时候显示一个或两个“DialogBox”时启用玻璃。 (当然,当盒子被解散时,你也必须检查玻璃状态。) – 2010-04-29 01:54:12