swingworker使用说明
1、创建swingworker实例,并在构造函数中引入任务执行的必要参数
PrimeNumbersTask task = new PrimeNumbersTask(textArea, otherParam);
textArea 用来显示动态的处理结果
otherParam 其他参数,比如要获取一万个素数,就输入10000
注意:SwingWorker<T, V>, T doInBackground()返回结果类型, V publish()和process() 参数集合中的类型
2、添加task的监听程序
task.addPropertyChangeListener(
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setIndeterminate(false);
progressBar.setValue((Integer)evt.getNewValue());
}
}
});
swingworker 默认可以监听的事件只有 progress 和 state
progress 事件是由 setProgress()方法执行触发,event.getNewValue()就是
任务当前的百分比进度,可以直接在 new JProgressBar(0, 100)这样的进度条的
setValue()方法中使用。
state 事件是由 swingworker 自动触发,有PENDING、STARTED、DONE三种状态
分别表示初始状态、已经开始但是还没有执行doInBackground()方法、doInBackground()
方法执行结束。
3、执行task
task.execute();
4、可选操作项
4.1、取得阻塞取得 doInBackground() 的执行结果
task.get();
4.2、取消正在执行的任务
task.cancel(true);
5、swingworker内部执行流程
doInBackground()
isCancelled() --检测是否有中断请求
setProgress(int progress)
firePropertyChange("progress",old,new)
PropertyChangeListener
publish(V... chunks)
process(List<V> chunks)
done()
6、推荐使用检查状态阻塞一个对话框等,不推荐get()阻塞
public void propertyChange(PropertyChangeEvent event) {
if ("state".equals(event.getPropertyName())
&& SwingWorker.StateValue.DONE == event.getNewValue()) {
dialog.setVisible(false);
dialog.dispose();
}