2008/03/18

JProgressBar in JTable Cell

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(java.util.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

5 comments:

  1. 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?

    thanks

    ReplyDelete
    Replies
    1. Hi Jorge,
      Maybe you can use a JProgressBar#setMaximum(int) in TableCellRenderer:
      TableCellProgressBar + JProgressBar#setMaximum(int)

      Delete
    2. thank you so much, works great :)

      Delete
  2. Ty bro! it works perfectly! I'd just create the class and then it works

    ReplyDelete