swingwork和进度条整合小例子
有个学弟问我swing进度条的用法,于是写了这个小例子。
package org.sz.tree;import java.awt.BorderLayout;public class TestJProgressBar extends JFrame{ private JProgressBar bar = new JProgressBar(0, 100); private JTextArea area = new JTextArea(); public TestJProgressBar() { setTitle("swingworker和进度条的小例子"); add(bar, BorderLayout.CENTER); add(area, BorderLayout.SOUTH); pack(); setVisible(true); start(); } private void start() { ProGressWork work = new ProGressWork(); work.addPropertyChangeListener(new PropertyChangeListener(){@Overridepublic void propertyChange(PropertyChangeEvent evt) {System.out.print(evt.getNewValue());} }); work.execute(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {new TestJProgressBar();} }); } class ProGressWork extends SwingWorker<List<Work>, Work> { @Overrideprotected List<Work> doInBackground() throws Exception { int i = 0; List<Work> list = new ArrayList<Work>(); //模拟耗时任务 //假设有100项待完成任务 while (i < 100) { i++; /*******模拟开始一项新工作*******/ Work w = new Work(i); list.add(w); publish(w); setProgress(100 * list.size() / 100); Thread.sleep(1000); /*******模拟完成此项工作*******/ } return list;} //调用publist的时候会调用 //注意这里是"批处理" @Override protected void process(List<Work> works) { for (Work work : works) { bar.setValue(work.getId()); } } @Override protected void done() { area.append("工作已全部完成"); } } class Work { //工作编号 private int id; public Work(int id) { this.id = id; } public int getId() { return id; } }}