Swing/ProgressMonitor のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ProgressMonitor へ行く。
  - 1 (2010-02-18 (木) 11:09:05)
- 2 (2010-02-27 (土) 02:49:02)
- 3 (2010-05-11 (火) 20:52:39)
- 4 (2011-04-03 (日) 04:36:06)
- 5 (2013-01-02 (水) 14:30:06)
- 6 (2013-04-15 (月) 03:02:59)
- 7 (2013-09-16 (月) 20:05:12)
- 8 (2014-12-19 (金) 14:10:44)
- 9 (2016-03-11 (金) 15:59:44)
- 10 (2017-04-04 (火) 14:17:08)
- 11 (2017-07-20 (木) 14:11:00)
- 12 (2018-07-18 (水) 15:56:58)
- 13 (2020-07-16 (木) 16:48:10)
- 14 (2021-12-16 (木) 09:53:20)
- 15 (2022-08-05 (金) 14:01:37)
- 16 (2025-01-03 (金) 08:57:02)
- 17 (2025-01-03 (金) 09:01:23)
- 18 (2025-01-03 (金) 09:02:38)
- 19 (2025-01-03 (金) 09:03:21)
- 20 (2025-01-03 (金) 09:04:02)
- 21 (2025-06-19 (木) 12:41:37)
- 22 (2025-06-19 (木) 12:43:47)
 
TITLE:ProgressMonitorで処理の進捗を表示
Posted by terai at 2010-02-15
ProgressMonitorで処理の進捗を表示
ProgressMonitorで処理の進捗を表示します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
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();
解説
上記のサンプルでは、ProgressMonitorを使ってSwingWorkerのタスクの進捗状態を表示しています。
PropertyChangeListenerは、TutorialのProgressMonitorDemo.javaを変更して使用しています。
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);
      }
    }
  }
}