在我的GWT项目中,我试图获得它,因此两个DialogBoxes可以在彼此之间传递信息。其中一个持有MapWidget,当在另一个DialogBox中按下一个按钮时,从另一个DialogBox的MapWidget接收位置信息。有没有人有任何关于如何在两个不同的DialogBoxes出现之间进行协调的提示?我应该在Composite中包装两者的代码吗?此外,还有一个例子可以在GWT中同时处理两个DialogBoxes吗?例如,如果我在两个框之外单击,则两个框都应该被关闭。我想知道是否有办法让它们立刻保持对焦,所以我可以在两者之间切换而不会导致它们消失。
答案 0 :(得分:1)
在对话框之间共享数据
在我看来,执行此操作的“正确”方法是在应用程序中实现某种MVP structure,以便演示者管理视图(DialogBox
es,以及其他内容)和知道如何将简单数据传递给视图以供显示(演示者将处理MapWidget
数据,视图将负责在DOM上显示它。)
但是,如果您正在寻找更快/更简单的方法,您有几个选项(您选择的选项实际上取决于应用程序结构):
Composite
,知道如何来回传递必要的数据。通过让Composite
管理数据对象并告诉两个DialogBox
es如何显示它,您实际上是在Composite
中接近MVP架构。DialogBox
子类化为包含HandlerManager
(有时用作“事件总线”)的类,该按钮在按下按钮时会触发事件。您可以创建旨在在两个DialogBox
之间来回传递数据的事件(甚至使用类型参数使其类型安全)。有关使用HandlerManager
的详细信息,请参阅this StackOverflow question。上面链接的MVP文章也有一些good information on using an event bus。Model-View-Presenter是一种经过验证的构建应用程序的方法,可以生成更多可测试的代码,更好的项目结构,并可以帮助指导您做出这样的决策。如果您还没有,我强烈建议您查看。
分享自动隐藏功能
GWT的PopupPanel
(DialogBox
所基于的)提供了一种方法addAutoHidePartner(Element)
,如下所述:
autoHide合作伙伴中发生的鼠标事件不会将面板设置隐藏为自动隐藏。
因此,您可以使用以下代码创建两个自动隐藏DialogBox
es,只有当您在两个框内单击时才会关闭它们(例如,当您在任一框中单击时它们不会关闭): / p>
// 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
的适当电话。