2010-05-17 46 views
0

我在this post中提到的問題實際上是因爲跨線程GUI問題(我希望)發生的。Java invokeAndWait C#Action Delegate

請問您可以幫助我使用Java版本的操作委託嗎?

 this.Invoke(new Action(delegate() 
     {...})); 

這是怎麼achived在Java中:

在C#

它,因爲這直列做了什麼?

謝謝。

public class processChatMessage implements Observer { 

    public void update(Observable o, Object obj) { 


     System.out.println("class class class" + obj.getClass()); 

     if (obj instanceof String){ 

      String msg = (String)obj; 

      formatChatHeader(chatHeader.Away, msg); 

      jlStatusBar.setText("Message Received"); 

      // Show chat form 
      setVisibility(); 

     } 
    } 
} 

processChatMessage由從遠程節點接收新數據觸發的單獨線程調用。

我想錯誤正在產生,因爲它試圖更新GUI控件。

你認爲這是原因嗎?我問,因爲我是新來的Java和C#,但這是我所想的事情。

SOLUTION:

public class processChatMessage implements Observer { 

    public void update(Observable o, Object obj) { 

     if (obj instanceof String){ 

      final String msg = (String)obj; 

      try { 

       SwingUtilities.invokeAndWait(new Runnable() { 

        public void run() { 

         formatChatHeader(chatHeader.Away, msg); 
         jlStatusBar.setText("Message Received"); 
         setVisibility(); 
        } 
       }); 
      } catch (InterruptedException e){ 

      } catch (InvocationTargetException e){ 

      } 
     } 
    } 
} 

回答

3

最近的等效很可能是Runnable接口 - 一個基本上與方法不採取任何參數和返回值不單方法接口。您可以使用匿名內部類實現的效果東西像匿名方法:

executeRunnable(new Runnable() { 
    public void run() { 
     // Do stuff here 
    } 
}); 

是的,這是一個有點冗長,...但希望 Java 7個的閉包會出手相救,最終:)

現在,這是一般Action代表的想法。在這個特定實例中,您應該分別查看SwingUtilities.invokeLater(Runnable)SwingUtilities.invokeAndWait(Runnable),分別爲Control.BeginInvokeControl.Invoke的粗略等效值。

+0

感謝您的提示,現在它的工作原理沒有像上一篇文章中報告的那樣拋出異常。 – iTEgg 2010-05-17 17:22:35

相關問題