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;
}
}
}