我的“问题”可以通过以下描述。假设我们有一个密集的过程,我们希望在后台运行并更新Swing JProgress栏。解决方案很简单:如何委派的SwingWorker的发布到其他方法
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
/**
* @author Savvas Dalkitsis
*/
public class Test {
public static void main(String[] args) {
final JProgressBar progressBar = new JProgressBar(0,99);
SwingWorker<Void, Integer> w = new SwingWorker<Void, Integer>(){
@Override
protected void process(List<Integer> chunks) {
progressBar.setValue(chunks.get(chunks.size()-1));
}
@Override
protected Void doInBackground() throws Exception {
for (int i=0;i<100;i++) {
publish(i);
Thread.sleep(300);
}
return null;
}
};
w.execute();
JOptionPane.showOptionDialog(null,
new Object[] { "Process", progressBar }, "Process",
JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
null, null, null);
}
}
现在假设我有很多方法需要很长时间。例如,我们有一种从服务器下载文件的方法。或另一个上传到服务器。或者任何真的。将发布方法委派给这些方法的正确方法是什么,以便他们可以适当地更新GUI?
是我迄今发现的是这个(假设法“amethod方法”存在于其他一些包为例):
import java.awt.event.ActionEvent;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
/**
* @author Savvas Dalkitsis
*/
public class Test {
public static void main(String[] args) {
final JProgressBar progressBar = new JProgressBar(0,99);
SwingWorker<Void, Integer> w = new SwingWorker<Void, Integer>(){
@Override
protected void process(List<Integer> chunks) {
progressBar.setValue(chunks.get(chunks.size()-1));
}
@SuppressWarnings("serial")
@Override
protected Void doInBackground() throws Exception {
aMethod(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
publish((Integer)getValue("progress"));
}
});
return null;
}
};
w.execute();
JOptionPane.showOptionDialog(null,
new Object[] { "Process", progressBar }, "Process",
JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
null, null, null);
}
public static void aMethod (Action action) {
for (int i=0;i<100;i++) {
action.putValue("progress", i);
action.actionPerformed(null);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
它的工作原理,但我知道这没啥事。有什么想法吗?
如果我们只有一种可怕的长方法会怎样?我不是downvoting,但这不是一个解决方案 – Xorty 2010-05-25 21:33:12
如果我的答案不好,你可以downvoting。但我读到了这样一个问题:“例如我们有一种方法可以从服务器上下载文件,或者另一种方法上传到服务器,或者任何其他方式”......所以我想有很多方法,而不仅仅是一个可怕的方法长 ? – Istao 2010-05-26 04:46:32
我遇到的问题是可以从代码的不同部分调用这些方法。而他们需要刷新的gui元素并不总是相同的。通过我的解决方案,我可以创建一个通用方法,并且每次创建一个新的摆动工人时,我都可以在我的GUI上确定工艺方法。 – 2010-05-26 19:35:25