MarketTable.java Source code

Java tutorial

Introduction

Here is the source code for MarketTable.java

Source

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