SwingWorker是一个Java多线程编程技术,用于在后台线程中执行耗时的操作,而不会阻塞GUI线程。当SwingWorker完成其任务时,它会自动将结果传递给其PropertyChangeListener监听器。如果您想回到EDT(事件分发线程),可以使用SwingWorker的done()
方法来触发一个事件,然后在EDT中处理该事件。
以下是一个示例代码:
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
// 执行耗时操作
Thread.sleep(2000);
return null;
}
@Override
protected void done() {
super.done();
// 触发结果事件
try {
Object result = get();
if (result != null) {
JOptionPane.showMessageDialog(null, result.toString(), "Result", JOptionPane.INFORMATION_MESSAGE);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("state".equals(evt.getPropertyName())) {
if (SwingWorker.StateValue.DONE.equals(evt.getNewValue())) {
// 处理结果事件
try {
Object result = get();
if (result != null) {
JOptionPane.showMessageDialog(null, result.toString(), "Result", JOptionPane.INFORMATION_MESSAGE);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
在这个示例中,我们创建了一个SwingWorker对象,并将其state
属性设置为SwingWorker.StateValue.RUNNING
。当SwingWorker完成其任务时,它会调用done()
方法,该方法会触发一个PropertyChangeEvent
事件,该事件将state
属性设置为SwingWorker.StateValue.DONE
。我们使用PropertyChangeListener
监听器来处理该事件,并在事件处理器中调用get()
方法来获取结果,并显示结果消息框。
如果您想在其他线程中调用SwingWorker,您可以在其他线程中创建一个SwingWorker
对象,并将其传递给SwingWorker
的execute()
方法,以便在后台线程中执行耗时的操作。
领取专属 10元无门槛券
手把手带您无忧上云