• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:ProgressMonitorで処理の進捗を表示
#navi(../)
RIGHT:Posted by [[terai]] at 2010-02-15
*ProgressMonitorで処理の進捗を表示 [#qfcff5da]
ProgressMonitorで処理の進捗を表示します。

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#fd3db85b]
#code{{
final ProgressMonitor monitor = new ProgressMonitor(this, "message", "note", 0, 100);
monitor.setProgress(0);
worker = new SwingWorker<String, String>() {
  @Override public String doInBackground() {
    int current = 0;
    int lengthOfTask = 120; //list.size();
    while(current<lengthOfTask && !isCancelled()) {
    //while(current<lengthOfTask && !monitor.isCanceled()) {
      try {
        Thread.sleep(50);
      }catch(InterruptedException ie) {
        return "Interrupted";
      }
      setProgress(100 * current / lengthOfTask);
      publish(current + "/" + lengthOfTask);
      current++;
    }
    return "Done";
  }
  @Override protected void process(java.util.List<String> chunks) {
    for(String message : chunks) {
      monitor.setNote(message);
    }
  }
  @Override public void done() {
    runButton.setEnabled(true);
    monitor.close();
    String text = null;
    if(isCancelled()) {
      text = "Cancelled";
    }else{
      try {
        text = get();
      }catch(Exception ex) {
        ex.printStackTrace();
        text = "Exception";
      }
    }
    //System.out.println(text);
    area.append(text+"\n");
    area.setCaretPosition(area.getDocument().getLength());
    //appendLine(text);
  }
};
worker.addPropertyChangeListener(new ProgressListener(monitor));
worker.execute();
}}

**解説 [#x1f15ca5]
上記のサンプルでは、ProgressMonitorを使ってSwingWorkerのタスクの進捗状態を表示しています。

----
PropertyChangeListenerは、Tutorialの[[ProgressMonitorDemo.java>http://java.sun.com/docs/books/tutorial/uiswing/examples/components/ProgressMonitorDemoProject/src/components/ProgressMonitorDemo.java]]を変更して使用しています。

#code{{
class ProgressListener implements PropertyChangeListener {
  private final ProgressMonitor monitor;
  public ProgressListener(ProgressMonitor monitor) {
    this.monitor = monitor;
    this.monitor.setProgress(0);
  }
  @Override
  public void propertyChange(PropertyChangeEvent e) {
    String strPropertyName = e.getPropertyName();
    if("progress".equals(strPropertyName)) {
      monitor.setProgress((Integer)e.getNewValue());
      if(monitor.isCanceled()) {
        ((SwingWorker)e.getSource()).cancel(true);
      }
    }
  }
}
}}

**参考リンク [#r9011528]
-[[How to Use Progress Bars (The Java Tutorials)>http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html]]

**コメント [#p0a19264]
#comment