我在this post中提到的问题实际上是由于跨线程GUI问题而发生的(我希望如此)。
你能帮我处理一下Java版本的行动代表吗?
在C#中,它是以以下内联方式完成的:
this.Invoke(new Action(delegate()
{...}));这是如何在Java中实现的?
谢谢。
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#很陌生,但我认为这就是正在发生的事情。
解决方案:
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){
}
}
}
}发布于 2010-05-17 16:36:16
最接近的等价物可能是Runnable接口--基本上是一个方法接口,方法不接受任何参数,也不返回值。您可以使用匿名内部类来实现类似于匿名方法的效果:
executeRunnable(new Runnable() {
public void run() {
// Do stuff here
}
});是的,有点冗长.但是,希望Java 7闭包最终能够拯救:)
现在,这是Action代表的一般想法。在这个特殊的例子中,您应该将SwingUtilities.invokeLater(Runnable)和SwingUtilities.invokeAndWait(Runnable)分别看作是Control.BeginInvoke和Control.Invoke的粗略等效。
https://stackoverflow.com/questions/2850865
复制相似问题