2016-02-02 60 views
2

我想要一個多選項卡/窗口的Eclipse RAP應用程序。Eclipse RAP多窗口/選項卡

我能夠打開使用

UrlLauncher launcher = RWT.getClient().getService(UrlLauncher.class); 
launcher.openURL("/gasf?foo=other_perspective"); 

當我用foo的參數設置爲選擇我要爲視角第二個窗口。然而,使用這種方法將創建一個特殊的http會話,因此各種監聽器等將不會與我的第一個窗口進行通信。 。

我還試圖打開使用

PlatformUI.getWorkbench()的第二窗口/頁getActiveWorkbenchWindow()openPage( 「other_perspective」,NULL);

但是,這只是改變當前的窗口視角,但不會在我的瀏覽器中打開第二個窗口或標籤。

是否有人通過在選項卡之間使用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()

我唯一的擔心是服務器負載多少,但至少它是一個合理的解決方案。我驗證了你的答案。

EDIT2: 只要是完整的,以確保在無效的線程訪問錯誤,不磕碰,因爲我們使用的是display.asyncExec更新從另一個顯示器的顯示,在doSomething()方法,我們必須執行操作:

Display display = Display.getCurrent(); 
public void doSomething() { 
    display.asyncExec(new Runnable() { 
     public void run() { 
      treeViewer.refresh(); 
     } 
    }); 
} 

回答

1

使用RAP的當前體系結構,不能將工作臺窗口分佈到不同的瀏覽器選項卡上。每個新的瀏覽器啓動一個新的UISession,這意味着另一個Display(請參閱Scopes in RAP)。

但是,HttpSession應該是相同的(除非您關閉cookie),所以您可以將其用作不同瀏覽器選項卡之間通信的方式。

+0

感謝您的澄清,好吧,這是一個很好的起點,所以我的後續問題是,是否有可能在用戶沒有任何點擊的情況下在一個選項卡的UI上觸發事件。我的想法是讓另一個選項卡上的事件在選項卡上調用刷新(或其他)。 – Jarod

+0

編輯我的問題,回答我的folloowup queston :)謝謝! – Jarod

+0

是的,使用ServerPush是在沒有用戶交互的情況下更新UI的唯一方法。在服務器上,它保持請求套接字打開,所以是的,有一些開銷,加上一些代理不喜歡長期的請求。這就是爲什麼我們建議只在需要時激活SP(例如爲了顯示正在運行的操作等) – ralfstx