Swing JFC Java

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