C#Action Delegate的Java invokeAndWait

时间:2010-05-17 16:31:11

标签: java multithreading

我在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){

            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

最接近的等价物可能是Runnable接口 - 基本上是单方法接口,方法不带参数并且不返回任何值。您可以使用匿名内部类来实现某些的效果,如匿名方法:

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

是的,它有点冗长......但希望 Java 7关闭将会得到拯救,最终:)

现在,这是Action委托的一般想法。在此特定实例中,您应该将SwingUtilities.invokeLater(Runnable)SwingUtilities.invokeAndWait(Runnable)分别视为Control.BeginInvokeControl.Invoke的粗略等效。