Я работаю со следующим кодом, который содержит JProgressBar внутри AbstractTableModel. Значение прогресса JProgressBar обновляется в «case 5:» функции getValueAt (), возвращая Float. Я пытаюсь выяснить, как получить доступ к базовому экземпляру JProgressBar, чтобы я мог изменить некоторые его свойства, кроме значения прогресса (например, 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);
}
}
Обновление: изначально это был не мой код, и я все еще знакомлюсь с ним, но я просто обнаружил, что существует класс ProgressRenderer, который расширяет JProgressBar и реализует TableCellRenderer. Это то, что используется для визуализации индикатора выполнения в таблице. Поэтому я собираюсь изменить этот код, чтобы изменить отображение индикатора выполнения:
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;
}
}