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