Swing/StringPaintedCellProgressBar のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/StringPaintedCellProgressBar へ行く。
- title: TableCellRendererに進捗文字列を設定したJProgressBarを使用する tags: [JTable, JProgressBar, SwingWorker, TableCellRenderer] author: aterai pubdate: 2014-03-24T00:27:55+09:00 description: JTableのTableCellRendererとして、進捗文字列を表示するJProgressBarを設定します。
概要
JTable
のTableCellRenderer
として、進捗文字列を表示するJProgressBar
を設定します。
Screenshot
Advertisement
サンプルコード
class Task extends SwingWorker<Integer, ProgressValue> {
private final int lengthOfTask;
private final int sleepDummy = new Random().nextInt(100) + 1;
public Task(int lengthOfTask) {
super();
this.lengthOfTask = lengthOfTask;
}
@Override protected Integer doInBackground() {
int current = 0;
while (current < lengthOfTask && !isCancelled()) {
current++;
try {
Thread.sleep(sleepDummy);
} catch (InterruptedException ie) {
break;
}
publish(new ProgressValue(lengthOfTask, current));
}
return sleepDummy * lengthOfTask;
}
}
class ProgressValue {
private final Integer progress;
private final Integer lengthOfTask;
public ProgressValue(Integer lengthOfTask, Integer progress) {
this.progress = progress;
this.lengthOfTask = lengthOfTask;
}
public Integer getProgress() {
return progress;
}
public Integer getLengthOfTask() {
return lengthOfTask;
}
}
class ProgressRenderer extends DefaultTableCellRenderer {
private final JProgressBar b = new JProgressBar();
private final JPanel p = new JPanel(new BorderLayout());
public ProgressRenderer() {
super();
setOpaque(true);
b.setStringPainted(true);
p.add(b);
}
@Override public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
String text = "Done";
if (value instanceof ProgressValue) {
ProgressValue pv = (ProgressValue) value;
Integer current = pv.getProgress();
Integer lengthOfTask = pv.getLengthOfTask();
if (current < 0) {
text = "Canceled";
} else if (current < lengthOfTask) {
b.setMaximum(lengthOfTask);
b.setValue(current);
b.setString(String.format("%d/%d", current, lengthOfTask));
return p;
}
}
super.getTableCellRendererComponent(
table, text, isSelected, hasFocus, row, column);
return this;
}
@Override public void updateUI() {
super.updateUI();
if (p != null) {
SwingUtilities.updateComponentTreeUI(p);
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、2
列目のTableCellRenderer
として、JProgressBar#setStringPainted(true)
と進捗文字列を表示するように設定したJProgressBar
を使用しています。進捗状況文字列は、現在値/最大値の形式で表示するため、SwingWorker#publish(...)
には、この2
つの値を保持するProgressValue
オブジェクトを作成して渡しています。TableCellRenderer
は、このProgressValue
オブジェクトを受け取り、JProgressBar#setMaximum(int)
(最大値は、各行ごとにランダムなので)、JProgressBar#setValue(int)
、JProgressBar#setString(String)
の3
つを設定したJProgressBar
をセル描画用コンポーネントとして返しています。