如何在java中将消息从工作线程传递给GUI

时间:2011-08-20 11:32:02

标签: java

如何在java中将消息从工作线程传递给GUI?我知道在Android中这可以通过处理程序和消息类来实现。但我希望Java中的相同内容可以帮助我。  提前致谢。  Ranganath.tm

5 个答案:

答案 0 :(得分:4)

您必须使用SwingUtilities.invokeLater,因为只能从事件派发线程访问Swing组件。

这个方法的javadoc有一个关于线程的Swing教程的链接。请点击此链接。

以下是一个例子:

public class SwingWithThread {
    private JLabel label;

    // ...

    public void startBackgroundThread() {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    // simulate some background work
                    Thread.sleep(5000L);
                }
                catch (InterruptedException e) {
                    // ignore
                }

                // update the label IN THE EDT!
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        label.setText("Background thread has stopped");
                    }
                });
            };
        };

        new Thread(r).start();
    }
}

答案 1 :(得分:2)

我认为最好的方法是使用EventBus& GUI组件的MVP设计。 “工作线程”通过将事件发送到总线来触发事件,并且作为特定类型事件的处理者的演示者被通知它。

这种设计的好描述可以在这里找到: Is there a recommended way to use the Observer pattern in MVP using GWT?

...虽然问题是关于GWT的答案适用于根据MVP设计的所有应用程序。

答案 2 :(得分:1)

发送活动。见this tutorial

答案 3 :(得分:1)

我们在FrostWire上这样做,通过这个实用程序函数,我们可以检查你正在使用的runnable / thread是否已经从GUI线程调用

/**
 * InvokesLater if not already in the dispatch thread.
 */
public static void safeInvokeLater(Runnable runnable) {
    if (EventQueue.isDispatchThread()) {
        runnable.run();
    } else {
        SwingUtilities.invokeLater(runnable);
    }
}

答案 4 :(得分:0)

您可以使用SwingWorker类,它旨在解决这种情况: http://download.oracle.com/javase/tutorial/uiswing/concurrency/worker.html