我在this post中提到的问题实际上是由于跨线程 GUI 问题而发生的(我希望如此)。
您能帮我处理 Java 版本的操作委托(delegate)吗?
在 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){
}
}
}
}
最佳答案
最接近的等价物可能是 Runnable 接口(interface) - 基本上是一个单方法接口(interface),其方法不带参数且不返回任何值。您可以使用匿名内部类来实现类似于匿名方法的效果:
executeRunnable(new Runnable() {
public void run() {
// Do stuff here
}
});
是的,这有点冗长...但是希望 Java 7 闭包最终能够解决问题:)
现在,这就是 Action
委托(delegate)的一般思想。在这个特定实例中,您应该将SwingUtilities.invokeLater(Runnable)
和SwingUtilities.invokeAndWait(Runnable)
视为的粗略等效项分别是 Control.BeginInvoke
和 Control.Invoke
。
关于C# Action Delegate 的 Java invokeAndWait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850865/