我正在使用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只适用于主窗口)但是用户可以在不同的浏览器选项卡中有很多不同的窗口,因此如果用户单击浏览器选项卡中不包含主窗口的菜单项,则重新加载虚拟窗口内容将无法正常工作。
答案 0 :(得分:3)
版本7和8出现了UI
的新概念和类。您现在可以在用户的Web浏览器中轻松打开另一个窗口/选项卡。 Vaadin平台支持多窗口应用程序的神奇新功能和巨大优势。
所有打开的窗口/标签共享相同的用户会话。
棘手的部分是,为了安全和避免令人讨厌的行为,浏览器不允许JavaScript直接打开另一个窗口,称为“弹出窗口”。新窗口/选项卡只能作为用户手势的直接结果打开,例如单击按钮。
因此,在Vaadin中,您必须使用BrowserWindowOpener
对象与Button
关联。您传递了您编写的.class
子类的UI
。 UI
子类会自动为您实例化,并显示在新窗口/选项卡中。
所有这些都在手册的Handling Browser Windows页面中得到了解释。
一个限制是我没有看到将对象传递给新窗口/选项卡,新UI
- 子类实例的直接方法。您可以间接地这样做。也许在会话中发布一个属性。或者可能在新窗口/选项卡的URI上设置字符串参数。我已经询问过将信息传递到新窗口for Vaadin 7和asked again for Vaadin 8的问题。
2011年,我与Vaadin开发团队成员讨论了同一个Vaadin 6应用程序的多个Web浏览器窗口或标签问题。他们强烈建议不要这样做。他们说虽然有可能,但这样做需要付出很多努力,往往会很麻烦且容易出错。
相反,他们建议在单个浏览器窗口/标签中使用Vaadin TabSheet。
TabSheet非常动态,因此您可以根据需要添加和删除标签。根据我的经验,性能出乎意料地快。请记住,只有最前面的选项卡的内容实际上在用户的浏览器窗口中。其他选项卡的内容在服务器的内存中,但不是Web浏览器/客户端的负担。虽然标签不能自动换行,因此往往很宽,但TabSheet会自动提供滚动显示的太多标签。
答案 1 :(得分:1)
在发布Vaadin7之前,您可以查看Navigator7附加组件(found here)
Navigator7允许多浏览器选项卡导航。 (在浏览器选项卡中单击,仅影响此浏览器选项卡)
我们在我们的应用程序中使用它并且它的工作非常好。
问候。