Java tutorial
/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O'Reilly */ // MarketTable.java //An application that display stock market data in a JTable. The table //uses the MarketDataModel class for its model. MYOSM should be running //to make the data dynamic. // import java.awt.BorderLayout; import java.util.Date; import java.util.Random; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; public class MarketTable extends JFrame { public MarketTable() { super("Dynamic Data Test"); setSize(300, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); // Set up our table model with a 5-second polling delay MarketDataModel mdm = new MarketDataModel(5); // Pick which stocks we want to watch . . . mdm.setStocks(new int[] { 0, 1, 2 }); // And pop up the table JTable jt = new JTable(mdm); JScrollPane jsp = new JScrollPane(jt); getContentPane().add(jsp, BorderLayout.CENTER); } public static void main(String args[]) { MarketTable mt = new MarketTable(); mt.setVisible(true); } } //MarketDataModel.java //A custom table model for use with the MYOSM enviornment. // class MarketDataModel extends AbstractTableModel implements Runnable { Thread runner; MYOSM market; int delay; public MarketDataModel(int initialDelay) { market = new MYOSM(); delay = initialDelay * 1000; Thread runner = new Thread(this); runner.start(); } Stock[] stocks = new Stock[0]; int[] stockIndices = new int[0]; String[] headers = { "Symbol", "Price", "Change", "Last updated" }; public int getRowCount() { return stocks.length; } public int getColumnCount() { return headers.length; } public String getColumnName(int c) { return headers[c]; } public Object getValueAt(int r, int c) { switch (c) { case 0: return stocks[r].symbol; case 1: return new Double(stocks[r].price); case 2: return new Double(stocks[r].delta); case 3: return stocks[r].lastUpdate; } throw new IllegalArgumentException("Bad cell (" + r + ", " + c + ")"); } public void setDelay(int seconds) { delay = seconds * 1000; } public void setStocks(int[] indices) { stockIndices = indices; updateStocks(); fireTableDataChanged(); } public void updateStocks() { stocks = new Stock[stockIndices.length]; for (int i = 0; i < stocks.length; i++) { stocks[i] = market.getQuote(stockIndices[i]); } } public void run() { while (true) { // Blind update . . . we could check for real deltas if necessary updateStocks(); // We know there are no new columns, so don't fire a data change, // only // fire a row update . . . this keeps the table from flashing fireTableRowsUpdated(0, stocks.length - 1); try { Thread.sleep(delay); } catch (InterruptedException ie) { } } } } //Stock.java //A simple aggregate class for storing stock market information on a single //stock (symbol, price, etc.). // class Stock { String symbol; double price; double delta; Date lastUpdate; public Stock(String s, double p) { symbol = s; price = p; lastUpdate = new Date(); } public void update(double d) { delta = d; price += delta; } public void print() { System.out.println(symbol + ": " + price + " (" + delta + ") last updated " + lastUpdate); } } //MYOSM.java //Make Your Own Stock Market: A simple stock market simulator that contains a //few stocks and their current prices (and deltas). It randomly adjusts the //prices on stocks to give a dynamic feel to the data. // class MYOSM extends JFrame implements Runnable { Stock[] market = { new Stock("JTree", 14.57), new Stock("JTable", 17.44), new Stock("JList", 16.44), new Stock("JButton", 7.21), new Stock("JComponent", 27.40) }; boolean monitor; Random rg = new Random(); Thread runner; public MYOSM() { // Not meant to be shown as a real frame super("Thread only version . . ."); runner = new Thread(this); runner.start(); } // This version creates a real frame so that you can see how the typical // stocks get updated. It's not meant to be used with other programs, // but rather as a debugging tool to make sure the market runs ok. public MYOSM(boolean monitorOn) { super("Stock Market Monitor"); setSize(400, 100); setDefaultCloseOperation(EXIT_ON_CLOSE); monitor = monitorOn; getContentPane().add(new JLabel("Trading is active. " + "Close this window to close the market."), BorderLayout.CENTER); runner = new Thread(this); runner.start(); } // Here's the heart of our stock market. In an infinite loop, just pick a // random stock and update its price. To make the program interesting, we'll // update a price every second. public void run() { while (true) { int whichStock = Math.abs(rg.nextInt()) % market.length; double delta = rg.nextDouble() - 0.4; market[whichStock].update(delta); if (monitor) { market[whichStock].print(); } try { Thread.sleep(1000); } catch (InterruptedException ie) { } } } public Stock getQuote(int index) { return market[index]; } // This method returns the list of all the symbols in the market table public String[] getSymbols() { String[] symbols = new String[market.length]; for (int i = 0; i < market.length; i++) { symbols[i] = market[i].symbol; } return symbols; } public static void main(String args[]) { MYOSM myMarket = new MYOSM(args.length > 0); myMarket.setVisible(true); } }