Swing/TableCellProgressBar のバックアップの現在との差分(No.10)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/TableCellProgressBar へ行く。
- 1 (2007-10-22 (月) 15:50:09)
- 2 (2007-10-23 (火) 17:00:23)
- 3 (2007-11-21 (水) 19:43:02)
- 4 (2007-12-05 (水) 20:58:44)
- 5 (2007-12-06 (木) 17:00:43)
- 6 (2007-12-19 (水) 21:08:43)
- 7 (2008-01-31 (木) 15:56:51)
- 8 (2008-02-29 (金) 13:17:40)
- 9 (2008-04-23 (水) 01:16:22)
- 10 (2010-01-14 (木) 15:17:02)
- 11 (2010-01-20 (水) 17:34:04)
- 12 (2010-02-04 (木) 16:54:27)
- 13 (2010-03-15 (月) 18:01:12)
- 14 (2010-07-08 (木) 21:48:24)
- 15 (2012-05-05 (土) 05:49:25)
- 16 (2012-05-06 (日) 02:24:05)
- 17 (2013-01-30 (水) 23:28:33)
- 18 (2013-09-04 (水) 00:12:15)
- 19 (2013-09-19 (木) 19:32:16)
- 20 (2014-03-24 (月) 00:30:23)
- 21 (2014-11-01 (土) 00:46:09)
- 22 (2014-11-25 (火) 03:03:31)
- 23 (2014-11-28 (金) 16:05:29)
- 24 (2015-03-01 (日) 16:07:19)
- 25 (2016-12-21 (水) 17:55:54)
- 26 (2017-03-29 (水) 19:43:45)
- 27 (2017-11-02 (木) 15:34:40)
- 28 (2018-02-15 (木) 17:31:58)
- 29 (2018-02-24 (土) 19:51:30)
- 30 (2019-05-22 (水) 19:35:38)
- 31 (2019-06-10 (月) 16:55:11)
- 32 (2021-02-21 (日) 03:55:38)
- 33 (2022-08-20 (土) 22:15:25)
- 34 (2024-01-05 (金) 08:22:05)
- 35 (2024-02-02 (金) 11:57:39)
- 36 (2024-02-03 (土) 14:25:16)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JTableのセルにJProgressBarを表示 #navi(../) RIGHT:Posted by [[terai]] at 2007-10-01 *JTableのセルにJProgressBarを表示 [#p482fe63] JTableのセルにJProgressBarを使用して進捗を表示します。 --- category: swing folder: TableCellProgressBar title: JTableのセルにJProgressBarを表示 tags: [JTable, JProgressBar, TableCellRenderer, SwingWorker] author: aterai pubdate: 2007-10-01T16:23:32+09:00 description: JTableのセルにJProgressBarを使用して進捗を表示します。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTUYeEtfWI/AAAAAAAAAl8/47mUyOKeiQY/s800/TableCellProgressBar.png hreflang: href: https://java-swing-tips.blogspot.com/2008/03/jprogressbar-in-jtable-cell.html lang: en --- * 概要 [#summary] `JTable`のセルに`JProgressBar`を使用して進捗を表示します。 -&jnlp; -&jar; -&zip; #download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTUYeEtfWI/AAAAAAAAAl8/47mUyOKeiQY/s800/TableCellProgressBar.png) #screenshot **サンプルコード [#tfa792a2] #code{{ * サンプルコード [#sourcecode] #code(link){{ class ProgressRenderer extends DefaultTableCellRenderer { private final JProgressBar b = new JProgressBar(0, 100); public ProgressRenderer() { super(); setOpaque(true); b.setBorder(BorderFactory.createEmptyBorder(1,1,1,1)); b.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Integer i = (Integer)value; @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Integer i = (Integer) value; String text = "Done"; if(i<0) { if (i < 0) { text = "Canceled"; }else if(i<100) { } else if (i < 100) { b.setValue(i); return b; } super.getTableCellRendererComponent(table, text, isSelected, hasFocus, row, column); super.getTableCellRendererComponent( table, text, isSelected, hasFocus, row, column); return this; } } }} #code{{ final int rowNumber = model.getRowCount(); private final Executor executor = Executors.newCachedThreadPool(); // ... int rowNumber = model.getRowCount(); SwingWorker<Integer, Integer> worker = new SwingWorker<Integer, Integer>() { private int sleepDummy = new Random().nextInt(100) + 1; private int rndSleep = new Random().nextInt(100) + 1; private int lengthOfTask = 120; @Override protected Integer doInBackground() { @Override protected Integer doInBackground() { int current = 0; while(current<lengthOfTask && !isCancelled()) { while (current < lengthOfTask && !isCancelled()) { current++; try { Thread.sleep(sleepDummy); }catch(InterruptedException ie) { Thread.sleep(rndSleep); } catch (InterruptedException ie) { publish(-1); break; } publish(100 * current / lengthOfTask); } return sleepDummy*lengthOfTask; return rndSleep * lengthOfTask; } @Override protected void process(java.util.List<Integer> chunks) { for(Integer value : chunks) { @Override protected void process(List<Integer> chunks) { for (Integer value: chunks) { model.setValueAt(value, rowNumber, 2); } //model.fireTableCellUpdated(rowNumber, 2); // model.fireTableCellUpdated(rowNumber, 2); } @Override protected void done() { @Override protected void done() { String text = null; int i = -1; if(isCancelled()) { if (isCancelled()) { text = "Canceled"; }else{ try{ } else { try { i = get(); text = "Done"; }catch(Exception ignore) { } catch (Exception ignore) { ignore.printStackTrace(); text = ignore.getMessage(); } } System.out.println(rowNumber +":"+text+"("+i+"ms)"); System.out.println(rowNumber + ":" + text + "(" + i + "ms)"); } }; model.addTest(new Test("example", 0), worker); worker.execute(); executor.execute(worker); // 1.6.0_18 // worker.execute(); //1.6.0_21 }} **解説 [#nf3d3b9b] 上記のサンプルでは、addボタンをクリックすると、JDK 6のSwingWorkerを使用したダミータスクが起動して、進捗状況がCell内のJProgressBarで表示されます。 * 解説 [#explanation] 上記のサンプルでは、`add`ボタンをクリックすると`SwingWorker`を使用したランダムな仮タスクが起動し、その進捗状況が`2`列目セル内の`JProgressBar`で表示されます。 ProgressRendererは、JProgressBarを一つ持ち、ダミータスクが動いている間は、そのJProgressBarに値を設定して描画用のコンポーネントとして返し、タスクが終了(またはキャンセル)されたらJLabel(自分自身、DefaultTableCellRenderer)に文字列を設定して返すようになっています。 ---- このサンプルでは、行番号をキーにしているため、例えばモデルから行を削除するときに実行中のタスクが手前の行などにあった場合はエラーが発生してしまいます。このため、実際には削除は行わず、フィルタを使って非表示にしています(参考: [[RowFilterでJTableの行をフィルタリング>Swing/RowFilter]])。 ---- - メモ -- [[Swing - Maximum number of SwingWorker objects in a Swing app?>http://forums.sun.com/thread.jspa?threadID=5268754]] - `ProgressRenderer`は`JProgressBar`を一つ持ち、仮タスクが動いている間はその`JProgressBar`に値を設定して描画用のコンポーネントとして返す - タスクが終了(またはキャンセル)されたら`JLabel`(自分自身、`DefaultTableCellRenderer`)に文字列を設定して返す - このサンプルでは、行番号をキーにしているため、例えばモデルから行を削除するときに実行中のタスクが手前の行などに存在する場合はエラーが発生する -- これを回避するため、実際には行の削除を実行せず、フィルタを使って行を非表示に設定する -- 参考: [[RowFilterでJTableの行をフィルタリング>Swing/RowFilter]] - `SwingWorker`スレッドの同時実行上限は`10`で固定 -- [https://community.oracle.com/thread/1364600 Swing - Maximum number of SwingWorker objects in a Swing app?] #code{{ public abstract class SwingWorker<T, V> implements RunnableFuture<T> { /** * number of worker threads. */ private static final int MAX_WORKER_THREADS = 10; }} **参考リンク [#mad68939] -[[SwingWorkerを使った処理の中断と進捗状況表示>Swing/SwingWorker]] * 参考リンク [#reference] - [[SwingWorkerを使った処理の中断と進捗状況表示>Swing/SwingWorker]] - [[TableCellRendererに進捗文字列を設定したJProgressBarを使用する>Swing/StringPaintedCellProgressBar]] - [[SwingWorkerを一スレッドずつ順番に実行する>Swing/SingleThreadExecutor]] **コメント [#m73864ef] - Windows + Java 1.7.0-ea-b24 での動作がおかしいみたいです。 -- [[terai]] &new{2007-12-19 (水) 21:08:43}; -- メモ: [[Bug 87 - Icedtea 1.7.0 and SwingWorker problem>http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=87]] -- [[terai]] &new{2008-01-31 (木) 15:56:51}; * コメント [#comment] #comment - %%`Windows` + `Java 1.7.0-ea-b24`での動作がおかしいみたいです。 -- &user(aterai); &new{2007-12-19 (水) 21:08:43};%% - メモ: [http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=87 Bug 87 - Icedtea 1.7.0 and SwingWorker problem] -- &user(aterai); &new{2008-01-31 (木) 15:56:51}; - `JDK 1.6.0_18`での修正: [https://bugs.openjdk.org/browse/JDK-6799345 [JDK-6799345] JFC demos threw exception in the Java Console when applets are closed - Java Bug System] -- &user(aterai); &new{2010-01-20 (水) 17:34:04}; -- 代わりに、`Executors.newCachedThreadPool().execute(worker);`のようにしているけど、これでいいのだろうか? 実行中にアプリケーションを終了する場合は、`ExecutorService#shutdown()`などを呼んだほうがよさそうだけど、このサンプルでは、`WindowConstants.EXIT_ON_CLOSE`で`VM`ごと落としているので、関係ない? -- &user(aterai); &new{2010-01-20 (水) 17:43:10}; -- 正常に動かなくなっている[https://www.oracle.com/technetwork/articles/javase/swingworker-137249.html Improve Application Performance With SwingWorker in Java SE 6]などのサンプルがどう修正されるか、様子見。 -- &user(aterai); &new{2010-01-20 (水) 17:47:11}; -- メモ: [https://bugs.openjdk.org/browse/JDK-6880336 [JDK-6880336] SwingWorker deadlocks due one thread in the swingworker-pool - Java Bug System] -- &user(aterai); &new{2010-03-15 (月) 18:01:12}; -- 修正されたようです。[http://www.oracle.com/technetwork/java/javase/bugfixes6u21-156339.html Java SE 6 Update 21 Bug Fixes] -- &user(aterai); &new{2010-07-08 (木) 21:48:24}; - メモ: [https://bugs.openjdk.org/browse/JDK-6826514 [JDK-6826514] SwingWorker: done() called before doInBackground() returns, when cancelled - Java Bug System] -- &user(aterai); &new{2010-02-04 (木) 16:54:27}; #comment