title: Stock Market Simulator Java GUI
body: <p>I am making a stock market simulator and I keep getting an error from each of my 3 classes the first class MYOSM the error is: </p>
  
  <blockquote>
    <p>"Cannot find symbol- class stock"</p>
  </blockquote>
  
  <p>The second class MarketTable outputs:</p>
  
  <blockquote>
    <p>Cannot find MarketDataModel</p>
  </blockquote>
  
  <p>And the third class MarketDataModel outputs the error:</p>
  
  <blockquote>
    <p>Cannot find symbol- class stock</p>
  </blockquote>
  
  <p>Have I gone wrong somewhere in my code I have checked it multiple times and I can't seem to locate it.</p>
  
  <p>Here is my code:</p>
  
  <p>MYOSM class:</p>
  
  <pre><code>import javax.swing.*;
  import java.awt.*;
  import java.util.*;
  
  public 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();
    }
  
  
    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();
    }
  
    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 &lt; market.length; i++) {
        symbols[i] = market[i].symbol;
      }
      return symbols;
    }
  
    public static void main(String args[]) {
      MYOSM myMarket = new MYOSM(args.length &gt; 0);
      myMarket.setVisible(true);
    }
  }
  </code></pre>
  
  <p>MarketTable class:</p>
  
  <pre><code>import java.awt.*;
  import javax.swing.*;
  
  public class MarketTable extends JFrame {
  
    public MarketTable() {
      super("Dynamic Data Test");
      setSize(300, 200);
      setDefaultCloseOperation(EXIT_ON_CLOSE);
  
      MarketDataModel mdm = new MarketDataModel(5);
  
      mdm.setStocks(new int[] { 0, 1, 2 });
  
      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);
    }
  }
  </code></pre>
  
  <p>MarketDataModel class:</p>
  
  <pre><code>import javax.swing.table.*;
  import javax.swing.*;
  
  public 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 &lt; stocks.length; i++) {
        stocks[i] = market.getQuote(stockIndices[i]);
      }
    }
  
    public void run() {
      while(true) {
  
        updateStocks();
  
  
        fireTableRowsUpdated(0, stocks.length - 1);
        try { Thread.sleep(delay); }
        catch(InterruptedException ie) {}
      }
    }
  }
  </code></pre>