/*
Swing, Second Edition
by Matthew Robinson, Pavel Vorobiev
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
public class StocksTable2 extends JFrame {
protected JTable m_table;
protected StockTableData m_data;
protected JLabel m_title;
public StocksTable2() {
super("Stocks Table");
setSize(600, 300);
m_data = new StockTableData();
m_title = new JLabel(m_data.getTitle(), new ImageIcon("money.gif"),
SwingConstants.LEFT);
m_title.setFont(new Font("TimesRoman", Font.BOLD, 24));
m_title.setForeground(Color.black);
getContentPane().add(m_title, BorderLayout.NORTH);
m_table = new JTable();
m_table.setAutoCreateColumnsFromModel(false);
m_table.setModel(m_data);
for (int k = 0; k < StockTableData.m_columns.length; k++) {
DefaultTableCellRenderer renderer = new ColoredTableCellRenderer();
renderer
.setHorizontalAlignment(StockTableData.m_columns[k].m_alignment);
TableColumn column = new TableColumn(k,
StockTableData.m_columns[k].m_width, renderer, null);
m_table.addColumn(column);
}
JTableHeader header = m_table.getTableHeader();
header.setUpdateTableInRealTime(false);
JScrollPane ps = new JScrollPane();
ps.getViewport().add(m_table);
getContentPane().add(ps, BorderLayout.CENTER);
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wndCloser);
setVisible(true);
}
public static void main(String argv[]) {
new StocksTable2();
}
}
class ColoredTableCellRenderer extends DefaultTableCellRenderer {
public void setValue(Object value) {
if (value instanceof ColorData) {
ColorData cvalue = (ColorData) value;
setForeground(cvalue.m_color);
setText(cvalue.m_data.toString());
} else if (value instanceof IconData) {
IconData ivalue = (IconData) value;
setIcon(ivalue.m_icon);
setText(ivalue.m_data.toString());
} else
super.setValue(value);
}
}
class ColorData {
public Color m_color;
public Object m_data;
public static Color GREEN = new Color(0, 128, 0);
public static Color RED = Color.red;
public ColorData(Color color, Object data) {
m_color = color;
m_data = data;
}
public ColorData(Double data) {
m_color = data.doubleValue() >= 0 ? GREEN : RED;
m_data = data;
}
public String toString() {
return m_data.toString();
}
}
class IconData {
public ImageIcon m_icon;
public Object m_data;
public IconData(ImageIcon icon, Object data) {
m_icon = icon;
m_data = data;
}
public String toString() {
return m_data.toString();
}
}
class StockData {
public static ImageIcon ICON_UP = new ImageIcon("ArrUp.gif");
public static ImageIcon ICON_DOWN = new ImageIcon("ArrDown.gif");
public static ImageIcon ICON_BLANK = new ImageIcon("blank.gif");
public IconData m_symbol;
public String m_name;
public Double m_last;
public Double m_open;
public ColorData m_change;
public ColorData m_changePr;
public Long m_volume;
public StockData(String symbol, String name, double last, double open,
double change, double changePr, long volume) {
m_symbol = new IconData(getIcon(change), symbol);
m_name = name;
m_last = new Double(last);
m_open = new Double(open);
m_change = new ColorData(new Double(change));
m_changePr = new ColorData(new Double(changePr));
m_volume = new Long(volume);
}
public static ImageIcon getIcon(double change) {
return (change > 0 ? ICON_UP : (change < 0 ? ICON_DOWN : ICON_BLANK));
}
}
class ColumnData {
public String m_title;
public int m_width;
public int m_alignment;
public ColumnData(String title, int width, int alignment) {
m_title = title;
m_width = width;
m_alignment = alignment;
}
}
class StockTableData extends AbstractTableModel {
static final public ColumnData m_columns[] = {
new ColumnData("Symbol", 100, JLabel.LEFT),
new ColumnData("Name", 160, JLabel.LEFT),
new ColumnData("Last", 100, JLabel.RIGHT),
new ColumnData("Open", 100, JLabel.RIGHT),
new ColumnData("Change", 100, JLabel.RIGHT),
new ColumnData("Change %", 100, JLabel.RIGHT),
new ColumnData("Volume", 100, JLabel.RIGHT) };
protected SimpleDateFormat m_frm;
protected Vector m_vector;
protected Date m_date;
public StockTableData() {
m_frm = new SimpleDateFormat("MM/dd/yyyy");
m_vector = new Vector();
setDefaultData();
}
public void setDefaultData() {
try {
m_date = m_frm.parse("4/6/1999");
} catch (java.text.ParseException ex) {
m_date = null;
}
m_vector.removeAllElements();
m_vector.addElement(new StockData("ORCL", "Oracle Corp.", 23.6875,
25.375, -1.6875, -6.42, 24976600));
m_vector.addElement(new StockData("EGGS", "Egghead.com", 17.25,
17.4375, -0.1875, -1.43, 2146400));
m_vector.addElement(new StockData("T", "AT&T", 65.1875, 66, -0.8125,
-0.10, 554000));
m_vector.addElement(new StockData("LU", "Lucent Technology", 64.625,
59.9375, 4.6875, 9.65, 29856300));
m_vector.addElement(new StockData("FON", "Sprint", 104.5625, 106.375,
-1.8125, -1.82, 1135100));
m_vector.addElement(new StockData("ENML", "Enamelon Inc.", 4.875, 5,
-0.125, 0, 35900));
m_vector.addElement(new StockData("CPQ", "Compaq Computers", 30.875,
31.25, -0.375, -2.18, 11853900));
m_vector.addElement(new StockData("MSFT", "Microsoft Corp.", 94.0625,
95.1875, -1.125, -0.92, 19836900));
m_vector.addElement(new StockData("DELL", "Dell Computers", 46.1875,
44.5, 1.6875, 6.24, 47310000));
m_vector.addElement(new StockData("SUNW", "Sun Microsystems", 140.625,
130.9375, 10, 10.625, 17734600));
m_vector.addElement(new StockData("IBM", "Intl. Bus. Machines", 183,
183.125, -0.125, -0.51, 4371400));
m_vector.addElement(new StockData("HWP", "Hewlett-Packard", 70,
71.0625, -1.4375, -2.01, 2410700));
m_vector.addElement(new StockData("UIS", "Unisys Corp.", 28.25, 29,
-0.75, -2.59, 2576200));
m_vector.addElement(new StockData("SNE", "Sony Corp.", 96.1875, 95.625,
1.125, 1.18, 330600));
m_vector.addElement(new StockData("NOVL", "Novell Inc.", 24.0625,
24.375, -0.3125, -3.02, 6047900));
m_vector.addElement(new StockData("HIT", "Hitachi, Ltd.", 78.5, 77.625,
0.875, 1.12, 49400));
}
public int getRowCount() {
return m_vector == null ? 0 : m_vector.size();
}
public int getColumnCount() {
return m_columns.length;
}
public String getColumnName(int column) {
return m_columns[column].m_title;
}
public boolean isCellEditable(int nRow, int nCol) {
return false;
}
public Object getValueAt(int nRow, int nCol) {
if (nRow < 0 || nRow >= getRowCount())
return "";
StockData row = (StockData) m_vector.elementAt(nRow);
switch (nCol) {
case 0:
return row.m_symbol;
case 1:
return row.m_name;
case 2:
return row.m_last;
case 3:
return row.m_open;
case 4:
return row.m_change;
case 5:
return row.m_changePr;
case 6:
return row.m_volume;
}
return "";
}
public String getTitle() {
if (m_date == null)
return "Stock Quotes";
return "Stock Quotes at " + m_frm.format(m_date);
}
}