Java tutorial
/* 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); } }