Swing/TwoProgressBars のバックアップ差分(No.4)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - 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を使用する #navi(../) #tags(SwingWorker, JProgressBar, Enum, PropertyChangeListener) RIGHT:Posted by &author(aterai); at 2011-06-13 *SwingWorkerで複数のJProgressBarを使用する [#xec05bbb] ひとつの``SwingWorker``で、進捗を表示する``JProgressBar``をふたつ使用します。 -&jnlp; -&jar; -&zip; //#screenshot #ref(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()) { return "Disposed"; } try{ convertFileToSomething(); }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()) { int iv = 100 * current / lengthOfTask; Thread.sleep(20); // dummy 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; } } } //...... }} **解説 [#n2dcd9c0] 上記のサンプルでは、デフォルトで用意されている``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); } } } }} **参考リンク [#m6d8d35f] - [[SwingWorkerを使った処理の中断と進捗状況表示>Swing/SwingWorker]] - [[SwingWorkerの一時停止と再開>Swing/PauseResumeSwingWorker]] **コメント [#bf0141a1] #comment