2013-11-22 46 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