2012-02-03 33 views
0

我有一個Java SWT應用程序,它運行與聊天服務器連接的單獨線程(UI除外)。如果我想更新從連接線的UI組件,我可以很容易地做到這一點:Java SWT - 從組件向其他線程返回數據的最佳方式

 myUIclass.MyShellReference.getDisplay().asyncExec(
       new Runnable() { 
       public void run(){ 
        ... update some UI component 

       } 
       } 
     ); 

我的問題是我無法找到從UI線程上的組​​件GET數據的好辦法。一個例子是想在我的連接線拉訂立UI線程文本框中的字符串,創建方法......

private String getTheText(){ 
    final String thetext;   
    myUIclass.MyShellReference.getDisplay().asyncExec(
     new Runnable() { 
       public void run(){ 

        // The below wont' work because thetext is final 
         // which is required in a nested class... blah! 
         thetext = myUIclass.getTextFromSomeTextBox(); 
      } 
     } 
    ); 
    return thetext; 
} 

上面的問題是,我無法真正捕捉返回什麼從getTextFromSomeTextBox()方法中,因爲我只能使用不能分配的最終變量。我知道的唯一的其他解決方案是使用一些Atomic參考對象,但必須有更好的方法,因爲我確信人們總是需要這樣做。

任何幫助將不勝感激!

+0

最終變量可以分配,但只能分配一次。 – 2012-02-03 00:12:09

回答

3

您可以使用一些傳遞對象來傳遞變量。這表明這個想法非常愚蠢例如:

private String getTheText(){ 
    final String[] thetext = new String[1]; //very stupid solution, but good for demonstrating the idea 

    myUIclass.MyShellReference.getDisplay().syncExec(//you should use sync exec here! 
     new Runnable() { 
       public void run(){ 

        // The below wont' work because thetext is final 
         // which is required in a nested class... blah! 
         thetext[0] = myUIclass.getTextFromSomeTextBox(); 
      } 
     } 
    ); 
    return thetext[0]; 
} 

另一種方法是使用回調或Future對象。

但實際上它有點奇怪的做法。我通常會將UI線程的值傳遞給另一個線程,因爲在UI線程中,我們知道到底發生了什麼,以及我們在外部提供了什麼樣的信息。

相關問題