我想要一个多标签/窗口的Eclipse RAP应用程序。
我可以使用
打开第二个窗口UrlLauncher launcher = RWT.getClient().getService(UrlLauncher.class);
launcher.openURL("/gasf?foo=other_perspective");
我使用foo参数来选择我想要的分辨率。但是,使用此方法将创建一个完整的http会话,因此各种听众等不会与我的第一个窗口进行通信。
我还尝试使用
打开第二个窗口/页面PlatformUI.getWorkbench()。getActiveWorkbenchWindow()。openPage(" other_perspective",null);
但这只会改变当前窗口的视角,但不会在我的浏览器中打开第二个窗口或标签。
有没有人在选项卡之间实现了一个多标签RAP应用程序?
感谢您提供的任何帮助
编辑: 非常感谢 ralfstx ,正如您所指出的,我可以使用共享HTTP会话共享监听器或任何内容,到目前为止一切顺利。现在,下一步是能够根据外部事件更新选项卡。
为了尝试从另一个标签刷新的想法,我做了一个虚拟计时器,它在2秒后执行某些操作(即模拟从另一个标签触发的内容):
final ServerPushSession pushSession = new ServerPushSession();
pushSession.start();
Display display = Display.getDefault();
NavigationView navigationView = ((NavigationView) window.getActivePage().findView(NavigationView.ID));
timer.schedule(new TimerTask() {
@Override
public void run() {
display.asyncExec(new Runnable() {
public void run() {
navigationView.doSomething();
}
});
}
}, 2000);
这个有效! pushSession.start()
强制UI在没有任何用户交互的情况下刷新。所以现在,只要达到2秒,就会在navigationView上执行操作doSomething()
。
我唯一关心的问题是这会给服务器带来多少负载,但它至少是一个合理的解决方案。我验证了你的答案。
EDIT2:
为了完整,为了确保不会因为我们从另一个显示更新显示而导致无效的线程访问错误,在doSomething()
方法中我们必须使用display.asyncExec
执行操作:
Display display = Display.getCurrent();
public void doSomething() {
display.asyncExec(new Runnable() {
public void run() {
treeViewer.refresh();
}
});
}
答案 0 :(得分:1)
使用RAP的当前体系结构,您无法在不同的浏览器选项卡上传播工作台窗口。每个新浏览器都会启动一个新的UISession
,这意味着另一个Display
(请参阅Scopes in RAP)。
但是,HttpSession
应该相同(除非您关闭了Cookie),因此您可以将其用作在不同浏览器标签之间进行通信的方式。