I'm working with the following code that contains a JProgressBar inside of an AbstractTableModel. The JProgressBar progress value is updated in "case 5: " of the getValueAt() function by returning a Float. What I'm trying to figure out is how to access the underlying JProgressBar instance so I can modify some of it's properties other than the progress value (such as setVisible()).
package org.jdamico.jhu.runtime;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
// This class manages the upload table's data.
class TransfersTableModel extends AbstractTableModel implements Observer {
/**
*
*/
private static final long serialVersionUID = 2740117506937325535L;
// These are the names for the table's columns.
private static final String[] columnNames = { "Type","Name", "UUID","Status",
"Stage","Progress","Total Start Time","Total End Time" };
// These are the classes for each column's values.
private static final Class[] columnClasses = { String.class,String.class,String.class,
String.class,String.class, JProgressBar.class, String.class, String.class};
// The table's list of uploads.
private ArrayList<ParentEntry> transferList = new ArrayList<ParentEntry>();
// Add a new upload to the table.
public void addTransfer(ParentEntry pe) {
// Register to be notified when the upload changes.
pe.addObserver(this);
transferList.add(pe);
// Fire table row insertion notification to table.
fireTableRowsInserted(getRowCount(), getRowCount());
}
// Get a upload for the specified row.
public ParentEntry getTransfer(int row) {
return transferList.get(row);
}
// Remove a upload from the list.
public void clearTransfer(int row) {
transferList.remove(row);
// Fire table row deletion notification to table.
fireTableRowsDeleted(row, row);
}
// Get table's column count.
public int getColumnCount() {
return columnNames.length;
}
// Get a column's name.
public String getColumnName(int col) {
return columnNames[col];
}
// Get a column's class.
public Class getColumnClass(int col) {
return columnClasses[col];
}
// Get table's row count.
public int getRowCount() {
return transferList.size();
}
// Get value for a specific row and column combination.
public Object getValueAt(int row, int col) {
ParentEntry pe = transferList.get(row);
switch (col) {
case 0:
return pe.getType();
case 1: // URL
return pe.getUrl();
case 2: //UUID
return pe.getUUID() + "";
case 3: // Status
return pe.getStatus().getDisplay();
case 4: // Stage
return pe.getStage().getDisplay();
case 5: //Progress
return new Float(pe.getProgress());
case 6:
if (pe.getTotalStartTime() != null)
return pe.getTotalStartTime().getTime().toString();
else
return "";
case 7:
if (pe.getTotalEndTime() != null)
return pe.getTotalEndTime().getTime().toString();
else
return "";
}
return "";
}
/*
* Update is called when a Upload notifies its observers of any changes
*/
public void update(Observable o, Object arg) {
int index = transferList.indexOf(o);
// Fire table row update notification to table.
fireTableRowsUpdated(index, index);
}
}
Update: This wasn't originally my code and I'm still familiarizing myself with it, but I just discovered that there was a ProgressRenderer class that extends JProgressBar and implements TableCellRenderer. This is what is being used to render the progress bar in the table. So I'm going to alter this code to alter how the progress bar is being displayed:
package org.jdamico.jhu.runtime;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
/*import org.jdamico.jhu.components.Controller;
import org.jdamico.jhu.components.FilePartition;
import org.vikulin.utils.Constants;*/
// This class renders a JProgressBar in a table cell.
class ProgressRenderer extends JProgressBar implements TableCellRenderer {
// Constructor for ProgressRenderer.
public ProgressRenderer(int min, int max) {
super(min, max);
}
/*
* Returns this JProgressBar as the renderer for the given table cell.
*/
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// Set JProgressBar's percent complete value.
Float tmp = ((Float) value).floatValue();
if (tmp == -1) {
this.setVisible(false);
}
else {
setValue((int) ((Float) value).floatValue());
if (this.isVisible() == false)
this.setVisible(true);
}
return this;
}
}