// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html
/* (swing1.1) */
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
/**
* @version 1.0 03/03/99
*/
public class IndicatorTableExample extends JPanel {
private static final int MAX = 100;
private static final int MIN = 0;
public IndicatorTableExample() {
setLayout(new BorderLayout());
DefaultTableModel dm = new DefaultTableModel() {
public Class getColumnClass(int col) {
switch (col) {
case 0:
return String.class;
case 1:
return Integer.class;
case 2:
return Integer.class;
default:
return Object.class;
}
}
public boolean isCellEditable(int row, int col) {
switch (col) {
case 2:
return false;
default:
return true;
}
}
public void setValueAt(Object obj, int row, int col) {
if (col != 1) {
super.setValueAt(obj, row, col);
return;
}
try {
Integer integer = new Integer(obj.toString());
super.setValueAt(checkMinMax(integer), row, col);
} catch (NumberFormatException ex) {
ex.printStackTrace();
}
}
};
dm.setDataVector(new Object[][] {
{ "not human", new Integer(100), new Integer(100) },
{ "hard worker", new Integer(76), new Integer(76) },
{ "ordinary guy", new Integer(51), new Integer(51) },
{ "lazy fellow", new Integer(12), new Integer(12) } },
new Object[] { "Name", "Result", "Indicator" });
JTable table = new JTable(dm);
IndicatorCellRenderer renderer = new IndicatorCellRenderer(MIN, MAX);
renderer.setStringPainted(true);
renderer.setBackground(table.getBackground());
// set limit value and fill color
Hashtable limitColors = new Hashtable();
limitColors.put(new Integer(0), Color.green);
limitColors.put(new Integer(60), Color.yellow);
limitColors.put(new Integer(80), Color.red);
renderer.setLimits(limitColors);
table.getColumnModel().getColumn(2).setCellRenderer(renderer);
table.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
if (e.getType() == TableModelEvent.UPDATE) {
int col = e.getColumn();
if (col == 1) {
int row = e.getFirstRow();
TableModel model = (TableModel) e.getSource();
Integer value = (Integer) model.getValueAt(row, col);
model.setValueAt(checkMinMax(value), row, ++col);
}
}
}
});
JScrollPane pane = new JScrollPane(table);
add(pane, BorderLayout.CENTER);
}
public static void main(String[] args) {
JFrame f = new JFrame("IndicatorTable Example");
f.getContentPane()
.add(new IndicatorTableExample(), BorderLayout.CENTER);
f.setSize(400, 120);
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
private Integer checkMinMax(Integer value) {
int intValue = value.intValue();
if (intValue < MIN) {
intValue = MIN;
} else if (MAX < intValue) {
intValue = MAX;
}
return new Integer(intValue);
}
}
/**
* @version 1.0 03/03/99
*/
class IndicatorCellRenderer extends JProgressBar implements TableCellRenderer {
private Hashtable limitColors;
private int[] limitValues;
public IndicatorCellRenderer() {
super(JProgressBar.HORIZONTAL);
setBorderPainted(false);
}
public IndicatorCellRenderer(int min, int max) {
super(JProgressBar.HORIZONTAL, min, max);
setBorderPainted(false);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
int n = 0;
if (!(value instanceof Number)) {
String str;
if (value instanceof String) {
str = (String) value;
} else {
str = value.toString();
}
try {
n = Integer.valueOf(str).intValue();
} catch (NumberFormatException ex) {
}
} else {
n = ((Number) value).intValue();
}
Color color = getColor(n);
if (color != null) {
setForeground(color);
}
setValue(n);
return this;
}
public void setLimits(Hashtable limitColors) {
this.limitColors = limitColors;
int i = 0;
int n = limitColors.size();
limitValues = new int[n];
Enumeration e = limitColors.keys();
while (e.hasMoreElements()) {
limitValues[i++] = ((Integer) e.nextElement()).intValue();
}
sort(limitValues);
}
private Color getColor(int value) {
Color color = null;
if (limitValues != null) {
int i;
for (i = 0; i < limitValues.length; i++) {
if (limitValues[i] < value) {
color = (Color) limitColors
.get(new Integer(limitValues[i]));
}
}
}
return color;
}
private void sort(int[] a) {
int n = a.length;
for (int i = 0; i < n - 1; i++) {
int k = i;
for (int j = i + 1; j < n; j++) {
if (a[j] < a[k]) {
k = j;
}
}
int tmp = a[i];
a[i] = a[k];
a[k] = tmp;
}
}
}