我在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#的新手,但这就是我想的。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){
}
}
}
}
答案 0 :(得分:3)
最接近的等价物可能是Runnable
接口 - 基本上是单方法接口,方法不带参数并且不返回任何值。您可以使用匿名内部类来实现某些的效果,如匿名方法:
executeRunnable(new Runnable() {
public void run() {
// Do stuff here
}
});
是的,它有点冗长......但希望 Java 7关闭将会得到拯救,最终:)
现在,这是Action
委托的一般想法。在此特定实例中,您应该将SwingUtilities.invokeLater(Runnable)
和SwingUtilities.invokeAndWait(Runnable)
分别视为Control.BeginInvoke
和Control.Invoke
的粗略等效。