Vaadin多个浏览器窗口/标签

时间:2012-02-24 06:43:52

标签: java vaadin

我正在使用Vaadin框架开发一个应用程序。应用程序有一个主菜单,当用户点击菜单项时,应用程序执行AbstractMenuCommand类的后代,如

public class RunReportCommand extends AbstractMenuAction {
@Override
public void execute() throws MenuException {
    Window = .... // create window here
    openWindow(window);
}
protected void openWindow(Window window) {
    application.getMainWindow().open(new ExternalResource(window.getURL()));
    application.setMainWindow(window);
}

}

在此主浏览器窗口内容被替换为所需窗口后。花了很多时间后我来到这个解决方案:如果你想用Vaadin Window替换浏览器窗口内容你应该总是这样做

    application.getMainWindow().open(new ExternalResource(window.getURL()));
    application.setMainWindow(window);

最近我有一个新功能要向应用程序添加一个功能:用户应该能够在不同的选项卡中打开窗口,所以问题是我在vaadin中只有一个主窗口(而window.open只适用于主窗口)但是用户可以在不同的浏览器选项卡中有很多不同的窗口,因此如果用户单击浏览器选项卡中不包含主窗口的菜单项,则重新加载虚拟窗口内容将无法正常工作。

2 个答案:

答案 0 :(得分:3)

Vaadin 7& Vaadin 8

版本7和8出现了UI的新概念和类。您现在可以在用户的​​Web浏览器中轻松打开另一个窗口/选项卡。 Vaadin平台支持多窗口应用程序的神奇新功能和巨大优势。

所有打开的窗口/标签共享相同的用户会话。

棘手的部分是,为了安全和避免令人讨厌的行为,浏览器不允许JavaScript直接打开另一个窗口,称为“弹出窗口”。新窗口/选项卡只能作为用户手势的直接结果打开,例如单击按钮。

因此,在Vaadin中,您必须使用BrowserWindowOpener对象与Button关联。您传递了您编写的.class子类的UIUI子类会自动为您实例化,并显示在新窗口/选项卡中。

所有这些都在手册的Handling Browser Windows页面中得到了解释。

一个限制是我没有看到将对象传递给新窗口/选项卡,新UI - 子类实例的直接方法。您可以间接地这样做。也许在会话中发布一个属性。或者可能在新窗口/选项卡的URI上设置字符串参数。我已经询问过将信息传递到新窗口for Vaadin 7asked again for Vaadin 8的问题。

Vaadin 6

2011年,我与Vaadin开发团队成员讨论了同一个Vaadin 6应用程序的多个Web浏览器窗口或标签问题。他们强烈建议不要这样做。他们说虽然有可能,但这样做需要付出很多努力,往往会很麻烦且容易出错。

相反,他们建议在单个浏览器窗口/标签中使用Vaadin TabSheet

TabSheet非常动态,因此您可以根据需要添加和删除标签。根据我的经验,性能出乎意料地快。请记住,只有最前面的选项卡的内容实际上在用户的浏览器窗口中。其他选项卡的内容在服务器的内存中,但不是Web浏览器/客户端的负担。虽然标签不能自动换行,因此往往很宽,但TabSheet会自动提供滚动显示的太多标签。

答案 1 :(得分:1)

在发布Vaadin7之前,您可以查看Navigator7附加组件(found here

Navigator7允许多浏览器选项卡导航。 (在浏览器选项卡中单击,仅影响此浏览器选项卡)

我们在我们的应用程序中使用它并且它的工作非常好。

问候。