Eclipse RAP multi-window/tab
Eclipse RAP multi-window/tab
我想要一个 multi-tab/windowed Eclipse RAP 应用程序。
我可以使用
打开第二个 window
UrlLauncher launcher = RWT.getClient().getService(UrlLauncher.class);
launcher.openURL("/gasf?foo=other_perspective");
我在哪里使用 foo 参数 select 我想要的透视图。但是,使用此方法将创建一个单独的 http 会话,因此各种侦听器等不会与我的第一个 window.
进行通信
我还尝试使用
打开第二个window/page
PlatformUI.getWorkbench().getActiveWorkbenchWindow().openPage("other_perspective" , null);
但这只会改变当前的 window 视角,而不会在我的浏览器中打开第二个 window 或选项卡。
有没有人通过在选项卡之间工作 selectionlisteners 实现了多选项卡 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()
。
我唯一担心的是这会给服务器带来多少负载,但这至少是一个合理的解决方案。我验证了你的答案。
编辑2:
为了完整起见,为了确保不会出现无效的线程访问错误,因为我们正在从另一个显示器更新显示器,在 doSomething()
方法中,我们必须使用 display.asyncExec
:
执行操作
Display display = Display.getCurrent();
public void doSomething() {
display.asyncExec(new Runnable() {
public void run() {
treeViewer.refresh();
}
});
}
使用当前的 RAP 体系结构,您无法 workbench windows 分布在不同的浏览器选项卡上。每个新浏览器都会启动一个新的 UISession
,这意味着另一个 Display
(参见 Scopes in RAP)。
但是,HttpSession
应该是相同的(除非您关闭了 cookie),因此您可以将其用作不同浏览器选项卡之间的通信方式。
我想要一个 multi-tab/windowed Eclipse RAP 应用程序。
我可以使用
打开第二个 windowUrlLauncher launcher = RWT.getClient().getService(UrlLauncher.class);
launcher.openURL("/gasf?foo=other_perspective");
我在哪里使用 foo 参数 select 我想要的透视图。但是,使用此方法将创建一个单独的 http 会话,因此各种侦听器等不会与我的第一个 window.
进行通信我还尝试使用
打开第二个window/pagePlatformUI.getWorkbench().getActiveWorkbenchWindow().openPage("other_perspective" , null);
但这只会改变当前的 window 视角,而不会在我的浏览器中打开第二个 window 或选项卡。
有没有人通过在选项卡之间工作 selectionlisteners 实现了多选项卡 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()
。
我唯一担心的是这会给服务器带来多少负载,但这至少是一个合理的解决方案。我验证了你的答案。
编辑2:
为了完整起见,为了确保不会出现无效的线程访问错误,因为我们正在从另一个显示器更新显示器,在 doSomething()
方法中,我们必须使用 display.asyncExec
:
Display display = Display.getCurrent();
public void doSomething() {
display.asyncExec(new Runnable() {
public void run() {
treeViewer.refresh();
}
});
}
使用当前的 RAP 体系结构,您无法 workbench windows 分布在不同的浏览器选项卡上。每个新浏览器都会启动一个新的 UISession
,这意味着另一个 Display
(参见 Scopes in RAP)。
但是,HttpSession
应该是相同的(除非您关闭了 cookie),因此您可以将其用作不同浏览器选项卡之间的通信方式。