Code
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));
}
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;
}
}
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()) {
if (!table.isDisplayable()) {
return -1;
}
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;
int i = -1;
if (isCancelled()) {
text = "Canceled";
} else {
try {
i = get();
text = (i>=0)?"Done":"Disposed";
} 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); // JDK 1.6.0_18
// worker.execute();
References
Hello, I use this code and work very good, but I need change, I need put de value of progress bar not fixed, you can help me? Or explain any algorithm to me?
ReplyDeletethanks
Hi Jorge,
DeleteMaybe you can use a JProgressBar#setMaximum(int) in TableCellRenderer:
TableCellProgressBar + JProgressBar#setMaximum(int)
thank you so much, works great :)
DeleteTy bro! it works perfectly! I'd just create the class and then it works
ReplyDeleteI'm glad you liked it :-)
Delete