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(){
			@Override
			public void propertyChange(PropertyChangeEvent evt) {
				System.out.print(evt.getNewValue());
			}
    	});
    	work.execute();
    }
    public static void main(String[] args) {
    	SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new TestJProgressBar();
			}
    	});
    }
    
    class ProGressWork extends SwingWorker<List<Work>, Work> {
    	@Override
		protected 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;
    	}
    }
}