Swing/TableCellProgressBar のバックアップ(No.32)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- 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:
hreflang:
href: https://java-swing-tips.blogspot.com/2008/03/jprogressbar-in-jtable-cell.html lang: en
概要
JTable
のセルにJProgressBar
を使用して進捗を表示します。
Screenshot
Advertisement
サンプルコード
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));
}
@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) {
text = "Canceled";
} else if (i < 100) {
b.setValue(i);
return b;
}
super.getTableCellRendererComponent(table, text, isSelected, hasFocus, row, column);
return this;
}
}
View in GitHub: Java, Kotlinprivate final Executor executor = Executors.newCachedThreadPool();
// ...
final int rowNumber = model.getRowCount();
SwingWorker<Integer, Integer> worker = new SwingWorker<Integer, Integer>() {
private int sleepDummy = new Random().nextInt(100) + 1;
private int lengthOfTask = 120;
@Override protected Integer doInBackground() {
int current = 0;
while (current < lengthOfTask && !isCancelled()) {
current++;
try {
Thread.sleep(sleepDummy);
} catch (InterruptedException ie) {
publish(-1);
break;
}
publish(100 * current / lengthOfTask);
}
return sleepDummy * lengthOfTask;
}
@Override protected void process(List<Integer> chunks) {
for (Integer value: chunks) {
model.setValueAt(value, rowNumber, 2);
}
//model.fireTableCellUpdated(rowNumber, 2);
}
@Override protected void done() {
String text = null;
int i = -1;
if (isCancelled()) {
text = "Canceled";
} else {
try {
i = get();
text = "Done";
} catch (Exception ignore) {
ignore.printStackTrace();
text = ignore.getMessage();
}
}
System.out.println(rowNumber + ":" + text + "(" + i + "ms)");
}
};
model.addTest(new Test("example", 0), worker);
executor.execute(worker); //1.6.0_18
//worker.execute(); //1.6.0_21
解説
上記のサンプルでは、add
ボタンをクリックすると、SwingWorker
を使用したダミータスクが起動し、その進捗状況が2
列目セル内のJProgressBar
で表示されます。
ProgressRenderer
はJProgressBar
を一つ持ち、ダミータスクが動いている間は、そのJProgressBar
に値を設定して描画用のコンポーネントとして返し、タスクが終了(またはキャンセル)されたらJLabel
(自分自身、DefaultTableCellRenderer
)に文字列を設定して返しています。
- このサンプルでは、行番号をキーにしているため、例えばモデルから行を削除するときに実行中のタスクが手前の行などに存在する場合はエラーが発生する
- これを回避するため、実際には行の削除を実行せず、フィルタを使って行を非表示に設定する
- 参考: RowFilterでJTableの行をフィルタリング
public abstract class SwingWorker<T, V> implements RunnableFuture<T> {
/**
* number of worker threads.
*/
private static final int MAX_WORKER_THREADS = 10;
参考リンク
- SwingWorkerを使った処理の中断と進捗状況表示
- TableCellRendererに進捗文字列を設定したJProgressBarを使用する
- SwingWorkerを一スレッドづつ順番に実行する