Swing/TwoProgressBars のバックアップ差分(No.6)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - 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)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- title: SwingWorkerで複数のJProgressBarを使用する tags: [SwingWorker, JProgressBar, Enum, PropertyChangeListener] author: aterai pubdate: 2011-06-13T13:44:00+09:00 description: ひとつのSwingWorkerで、進捗を表示するJProgressBarをふたつ使用します。 --- * 概要 [#xec05bbb] ひとつの`SwingWorker`で、進捗を表示する`JProgressBar`をふたつ使用します。 #download(https://lh6.googleusercontent.com/-S6ko35_DIi8/TfWPa08dHvI/AAAAAAAAA9I/MNhC-0LF8YQ/s800/TwoProgressBars.png) * サンプルコード [#p537a3f8] #code(link){{ enum Component { TOTAL, FILE, LOG } class Progress { public final Object value; public final Component component; public Progress(Component component, Object value) { this.component = component; this.value = value; } } //... worker = new SwingWorker<String, Progress>() { @Override public String doInBackground() { int current = 0; int lengthOfTask = 12; //filelist.size(); publish(new Progress(Component.LOG, "Length Of Task: " + lengthOfTask)); publish(new Progress(Component.LOG, "\n------------------------------\n")); while(current<lengthOfTask && !isCancelled()) { if(!bar1.isDisplayable()) { while (current < lengthOfTask && !isCancelled()) { if (!bar1.isDisplayable()) { return "Disposed"; } try{ try { convertFileToSomething(); }catch(InterruptedException ie) { } catch (InterruptedException ie) { return "Interrupted"; } publish(new Progress(Component.LOG, "*")); publish(new Progress(Component.TOTAL, 100 * current / lengthOfTask)); current++; } publish(new Progress(Component.LOG, "\n")); return "Done"; } private final Random r = new Random(); private void convertFileToSomething() throws InterruptedException{ int current = 0; int lengthOfTask = 10+r.nextInt(50); //long lengthOfTask = file.length(); while(current<=lengthOfTask && !isCancelled()) { while (current <= lengthOfTask && !isCancelled()) { int iv = 100 * current / lengthOfTask; Thread.sleep(20); // dummy publish(new Progress(Component.FILE, iv+1)); publish(new Progress(Component.FILE, iv + 1)); current++; } } @Override protected void process(java.util.List<Progress> chunks) { for(Progress s: chunks) { switch(s.component) { case TOTAL: bar1.setValue((Integer)s.value); break; case FILE: bar2.setValue((Integer)s.value); break; case LOG: area.append((String)s.value); break; @Override protected void process(List<Progress> chunks) { for (Progress s: chunks) { switch (s.component) { case TOTAL: bar1.setValue((Integer) s.value); break; case FILE: bar2.setValue((Integer) s.value); break; case LOG: area.append((String) s.value); break; } } } //...... //... }} * 解説 [#n2dcd9c0] 上記のサンプルでは、デフォルトで用意されている`SwingWorker#setProgress(int)`は使用せず、以下の`3`つのコンポーネントの状態を表す`Progress`クラスを作成し、これを`SwingWorker<String, Progress>#publish(Progress)`メソッドに与えて`EDT`上でそれぞれの状態を更新しています。 - 全体の進捗を表示する`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(); if ("file-progress".equals(strPropertyName)) { int progress = (Integer) e.getNewValue(); progressBar.setValue(progress); } } } }} * 参考リンク [#m6d8d35f] - [[SwingWorkerを使った処理の中断と進捗状況表示>Swing/SwingWorker]] - [[SwingWorkerの一時停止と再開>Swing/PauseResumeSwingWorker]] * コメント [#bf0141a1] #comment #comment