2013-11-22 81 views
0

在我的Java程序中,我有這將啓動兩個線程主類:更改URL(?從其他線程)在Java SWT瀏覽器

  • BrowserwindowJFrameSWT browser
  • Pagecyclecontroller(類週期通過頁面列表)

我的主類的通知時Pagecyclecontroller更新其當前的URL,但我不能告訴我Browserwindow改變其頁面。

我第一次猜測是公開的方法(在Browserwindow),setURL,this.browser.setURL(..);但它沒有工作。

我不是很farmiliar與SWT Browser,它似乎環路其線程在本節:

... 
shell.open(); 
while (!shell.isDisposed() && frame.isVisible()) { 
    if (!display.readAndDispatch()) { 
    display.sleep(); 
    } 
} 
display.dispose(); 
frame.dispose(); 

如果我更改任何此類(如增加browser.setURL(...))沒有什麼作品在所有... 和在哪裏我什麼時候更改瀏覽器本身的URL?其他班級如何改變它?

+0

開始在UI線程之前?或者在你的UI級別的某個地方。還必須有某種「聽衆」,您可以在其中聽「開放」或「開始」事件。在那裏你也可以改變網址。我建議閱讀一些SWT Howto指南開始。谷歌將幫助你 – zip

+0

我實現了Pagecycles和Browserwindow作爲Observer,在我的窗口中調用「update」工作,直到我嘗試更改URL ..「org.eclipse.swt.SWTException:無效的線程訪問」 – user2078872

+0

看來你主要使用SWT,那麼爲什麼'JFrame'? – Baz

回答

3

您無法從非UI線程更新GUI。閱讀:

Why do I get an invalid thread access exception?

的解決方案是使用Display#asyncExec()

Display.getDefault().asyncExec(new Runnable() { 
    public void run() { 
     // do any work that updates the screen 
     // e.g., call browser.setURL(...); 
    } 
}); 
+0

是的!在我的更新方法中,「Display.getDefault()。asyncExec(new Runnable(){...}」是關鍵!謝謝 – user2078872

+0

@ user2078872不客氣,很高興我能提供幫助。 – Baz