【问题标题】:Connecting two DialogBoxes in GWT在 GWT 中连接两个对话框
【发布时间】:2010-04-13 07:15:37
【问题描述】:

在我的 GWT 项目中,我正在尝试获取它,以便两个 DialogBox 可以在彼此之间传递信息。其中一个持有 MapWidget,当在另一个 DialogBox 中按下按钮时,将从该另一个 DialogBox 的 MapWidget 接收位置信息。有没有人对我应该如何在显示两个不同的对话框之间进行协调有任何提示?我应该将两者的代码包装在 Composite 中吗?此外,是否有在 GWT 中一次处理两个对话框的示例?例如,如果我在两个框之外单击,则两者都应该被关闭。我想知道是否有办法让它们同时保持焦点,这样我就可以在两者之间切换而不会导致任何一个消失。

【问题讨论】:

    标签: api gwt google-maps dialog


    【解决方案1】:

    在对话框之间共享数据

    在我看来,“正确”的做法是在应用程序中实现某种MVP structure,以便演示者管理视图(DialogBoxes 等)并知道如何通过将简单数据添加到视图以供其显示(演示者将处理 MapWidget 数据,视图将负责将其显示在 DOM 上)。

    但是,如果您正在寻找一种更快/更简单的方法,您有几个选择(您的选择实际上取决于应用程序结构):

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

    Model-View-Presenter 是一种久经考验的构建应用程序的方法,可生成更可测试的代码、更好的项目结构,并且可以帮助指导您做出此类决策。如果您还没有,我强烈建议您检查一下。

    分享自动隐藏功能

    GWT 的 PopupPanelDialogBox 所基于)提供了一种方法 addAutoHidePartner(Element),如下所述:

    在自动隐藏伙伴中发生的鼠标事件不会隐藏设置为自动隐藏的面板。

    因此,您可以使用以下代码创建两个自动隐藏DialogBoxes,它们仅在您在它们之外单击时才会关闭(例如,当您在任一框内单击时它们不会关闭):

    // 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 的适当调用。

    【讨论】:

    • 非常感谢,它有效!唯一的问题是我似乎不能为两个 DialogBox 设置 setGlassEnabled(true)。哦,好吧。
    • 很高兴听到这个消息!您可以考虑重载show() 以检查另一个DialogBox 是否已显示并启用了玻璃,因此在调用父show() 之前以编程方式设置玻璃的启用状态。这将允许您在显示 DialogBoxes 之一或两者时随时启用玻璃。 (当然,您还必须在盒子被关闭时检查玻璃状态。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多