我正在重构一些运行多阶段流程的代码。每个步骤都在嵌套的内部java.awt.EventQueue.invokeLAter
.... 称呼。它看起来有点像这样:
import java.awt.EventQueue;
public class NestedInvokeLater {
/**
* @param args
*/
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
changeTabPanel();
copySomeFiles();
enableNextButton1();
upDateProgressBar(10);
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
readInFiles();
doSomethingToFiles();
upDateProgressBar(15);
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
doSomethingElse();
upDateProgressBar(100);
}
});
}
});
}
});
};
}
我对 Java 还很陌生,但我不明白其中的意义nesting这些电话将“工作”添加到 EDT,而且我也不是 100% 有信心摆弄这些电话。我想我明白了什么稍后调用调用的作用,以及每个步骤的作用。如果这个理解有误,请指正:
稍后调用是用来添加一些调用到要在事件调度线程中完成的作业列表。然后,Java 处理每次调用何时/如何完成,确保 EDT 以及 GUI 在“后台”执行作业时不会锁定。
嵌套这些调用对我来说,我们应该对一组作业进行排队,其中一个是对某些作业进行排队,其中一个将对某些作业进行排队......其中一个是对某些作业进行排队。但是,只有前一个作业完成后,第一个内部调用才会排队。一切都是按顺序发生的(这符合我对整个过程的理解),但我不明白为什么你会使用嵌套请求来排队作业来这样做。如果我从头开始编写此内容,我会简单地为每次调用创建函数并依次调用它们。
我认识到,作为 Java 的新手,我可能错过了一些使这种嵌套变得重要的重要内容。但没有这方面的文档,代码中也没有关于嵌套的注释。
我缺少什么?如果这段代码有什么意义的话,那是什么?
做这么多没有意义nested调用。这是基于良好的意愿,但实施得很糟糕。
如果您想正确执行此操作,请使用SwingWorker
.
The 的文档SwingWorker http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html有一个简洁的示例,说明您应该如何在应用程序的后台执行多个任务(PrimeNumbersTask
课程在那里显示)。
编辑:以下是在您的案例中应该如何使用 SwingWorker 的示例。
class SequentialInvoker extends SwingWorker<Void, Integer> {
@Override
public void doInBackground() {
changeTabPanel();
copySomeFiles();
enableNextButton1();
setProgress(10);
readInFiles();
doSomethingToFiles();
setProgress(15);
doSomethingElse();
setProgress(100);
}
}
要实际在进度条上显示进度,请查看以下代码,该代码复制自SwingWorker
文档:
JTextArea textArea = new JTextArea();
JProgressBar progressBar = new JProgressBar(0, 100);
SequentialInvoker task = new SequentialInvoker();
task.addPropertyChangeListener(
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer)evt.getNewValue());
}
}
});
使用此代码,您的进度条将显示进度SwingWorker
works.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)