// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html
/*
* (swing1.1beta3) swing#960
*/
import java.awt.Container;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
/**
* @version 1.0 12/03/98
*/
class DecimalRenderer extends DefaultTableCellRenderer {
DecimalFormat formatter;
DecimalRenderer(String pattern) {
this(new DecimalFormat(pattern));
}
DecimalRenderer(DecimalFormat formatter) {
this.formatter = formatter;
setHorizontalAlignment(JLabel.RIGHT);
}
public void setValue(Object value) {
setText((value == null) ? "" : formatter.format(((Double) value)
.doubleValue()));
}
}
public class TotalRowExample extends JFrame {
final private int TOTAL_ROW = 3;
final private int TOTAL_COLUMN = 1;
TotalRowExample() {
super("Total Row Example");
final DecimalFormat formatter = new DecimalFormat("###,##0.00");
DefaultTableModel dm = new DefaultTableModel() {
public void setValueAt(Object value, int row, int col) {
Vector rowVector = (Vector) dataVector.elementAt(row);
if (col == TOTAL_COLUMN) {
Double d = null;
if (value instanceof Double) {
d = (Double) value;
} else {
try {
d = new Double(((Number) formatter
.parse((String) value)).doubleValue());
} catch (ParseException ex) {
d = new Double(0.0);
}
}
rowVector.setElementAt(d, col);
} else {
rowVector.setElementAt(value, col);
}
}
public boolean isCellEditable(int row, int col) {
if (row == TOTAL_ROW)
return false;
return true;
}
public Class getColumnClass(int col) {
if (col == TOTAL_COLUMN)
return Number.class;
return String.class;
}
};
dm.setDataVector(new Object[][] { { "coffee", new Double(0.0) },
{ "tea", new Double(0.0) }, { "cocoa", new Double(0.0) },
{ "total", new Double(0.0) } },
new Object[] { "Item", "Price" });
JTable table = new JTable(dm) {
public void editingStopped(ChangeEvent e) {
super.editingStopped(e);
reCalcurate(getModel());
repaint();
}
};
table.getColumn("Price")
.setCellRenderer(new DecimalRenderer(formatter));
JScrollPane scroll = new JScrollPane(table);
Container content = getContentPane();
content.add(scroll);
setSize(300, 120);
setVisible(true);
}
private void reCalcurate(TableModel ml) {
if (ml == null)
return;
double total = 0.0;
for (int i = 0; i < TOTAL_ROW; i++) {
total += ((Double) ml.getValueAt(i, TOTAL_COLUMN)).doubleValue();
}
ml.setValueAt(new Double(total), TOTAL_ROW, TOTAL_COLUMN);
}
public static void main(String[] args) {
TotalRowExample frame = new TotalRowExample();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}