Swing/TwoProgressBars のバックアップ差分(No.15)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/TwoProgressBars へ行く。
- 1 (2011-07-26 (火) 19:42:54)
- 2 (2012-12-20 (木) 12:03:04)
- 3 (2013-08-16 (金) 16:15:20)
- 4 (2013-08-16 (金) 17:17:10)
- 5 (2014-12-16 (火) 14:26:44)
- 6 (2015-03-13 (金) 13:38:38)
- 7 (2015-03-20 (金) 15:19:55)
- 8 (2015-03-26 (木) 15:41:03)
- 9 (2017-02-17 (金) 14:20:35)
- 10 (2017-12-29 (金) 16:21:01)
- 11 (2019-05-22 (水) 19:35:38)
- 12 (2019-12-24 (火) 20:40:04)
- 13 (2021-06-29 (火) 18:39:25)
- 14 (2024-02-02 (金) 11:53:16)
- 15 (2024-02-03 (土) 14:23:51)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: TwoProgressBars title: SwingWorkerで複数のJProgressBarを使用する tags: [SwingWorker, JProgressBar, Enum, PropertyChangeListener] author: aterai pubdate: 2011-06-13T13:44:00+09:00 description: ひとつのSwingWorkerで、進捗を表示するJProgressBarをふたつ使用します。 image: https://lh6.googleusercontent.com/-S6ko35_DIi8/TfWPa08dHvI/AAAAAAAAA9I/MNhC-0LF8YQ/s800/TwoProgressBars.png --- * 概要 [#summary] ひとつの`SwingWorker`で、進捗を表示する`JProgressBar`をふたつ使用します。 #download(https://lh6.googleusercontent.com/-S6ko35_DIi8/TfWPa08dHvI/AAAAAAAAA9I/MNhC-0LF8YQ/s800/TwoProgressBars.png) * サンプルコード [#sourcecode] #code(link){{ enum ComponentType { TOTAL, FILE, LOG } class Progress { public final Object value; public final ComponentType componentType; public Progress(ComponentType componentType, Object value) { this.componentType = componentType; this.value = value; } } // ... worker = new SwingWorker<String, Progress>() { private final Random r = new Random(); @Override public String doInBackground() throws InterruptedException { int current = 0; int lengthOfTask = 12; // filelist.size(); publish(new Progress(ComponentType.LOG, "Length Of Task: " + lengthOfTask)); publish(new Progress(ComponentType.LOG, "\n------------------------------\n")); while (current < lengthOfTask && !isCancelled()) { if (!bar1.isDisplayable()) { return "Disposed"; } convertFileToSomething(); publish(new Progress(ComponentType.LOG, "*")); publish(new Progress(ComponentType.TOTAL, 100 * current / lengthOfTask)); current++; } publish(new Progress(ComponentType.LOG, "\n")); return "Done"; } private void convertFileToSomething() throws InterruptedException { int current = 0; int lengthOfTask = 10 + r.nextInt(50); // long lengthOfTask = file.length(); while (current <= lengthOfTask && !isCancelled()) { int iv = 100 * current / lengthOfTask; Thread.sleep(20); // dummy publish(new Progress(Component.FILE, iv + 1)); current++; } } @Override protected void process(List<Progress> chunks) { for (Progress s: chunks) { switch (s.componentType) { case TOTAL: bar1.setValue((Integer) s.value); break; case FILE: bar2.setValue((Integer) s.value); break; case LOG: area.append((String) s.value); break; } } } // ... }} * 解説 [#explanation] 上記のサンプルでは、デフォルトで用意されている`SwingWorker#setProgress(int)`は使用せず、以下の`3`つのコンポーネントの状態を表す`Progress`クラスを作成し、これを`SwingWorker<String, Progress>#publish(Progress)`メソッドに与えて`EDT`上でそれぞれの状態を更新しています。 - 全体の進捗を表示する`JProgressBar` - 個々のファイル処理(このサンプルでは`Thread.sleep(...)`するだけのダミー)の進捗を表示する`JProgressBar` - 個々のファイル処理(このサンプルではランダムに`Thread.sleep(...)`を実行するだけ)の進捗を表示する`JProgressBar` - ログを表示する`JTextArea` ---- - `SwingWorker`に別の`PropertyChangeListener`を追加する方法もある #code{{ worker.firePropertyChange("file-progress", iv, iv + 1); // ... class SubProgressListener implements PropertyChangeListener { private final JProgressBar progressBar; public SubProgressListener(JProgressBar progressBar) { this.progressBar = progressBar; this.progressBar.setValue(0); } @Override public void propertyChange(PropertyChangeEvent e) { String strPropertyName = e.getPropertyName(); if ("file-progress".equals(strPropertyName)) { int progress = (Integer) e.getNewValue(); progressBar.setValue(progress); } } } }} * 参考リンク [#reference] - [[SwingWorkerを使った処理の中断と進捗状況表示>Swing/SwingWorker]] - [[SwingWorkerの一時停止と再開>Swing/PauseResumeSwingWorker]] * コメント [#comment] #comment #comment