Cannot make static reference to non static method

creating a virtual stock market having been given a data list of 1000 daily stock prices which has been loaded in separately. my problem is when I try to do Graph.draw(); in my main class it gives me an error of cannot make a static reference to the non-static method draw() from the myStockProject.draw

import java.util.*;
ArrayList<String> tickers = new ArrayList();
ArrayList<Float> openingPrices = new ArrayList();
ArrayList<Float> closingPrices = new ArrayList();
ArrayList<Float> adjustedClosingPrices = new ArrayList();
ArrayList<Float> lowestPrices = new ArrayList();
ArrayList<Float> highestPrices = new ArrayList();
ArrayList<Float> volume = new ArrayList();
ArrayList<String> dates = new ArrayList();
ArrayList<Integer> days = new ArrayList();
ArrayList<Integer> months = new ArrayList();
ArrayList<Integer> years = new ArrayList();
ArrayList<Integer> range = new ArrayList();
ArrayList<Data> myData;
ArrayList<Widget> queries;
Data singularData;
Screen screenOne;
Screen screenTwo;
Screen screenThree;
Graph myGraph = new Graph();
Widget firstWidget;
ArrayList <Widget> widgetList;
ArrayList <Widget> direction ;
TextWidget focus;
PFont widgetFont;
final int EVENT_TEXT=-1;
final int EVENT_BACKWARD=-2;
final int TEXT_WIDGET = 1;
final int EVENT_NULL=0;
int event;
int qEvents;
color widgetBorder;
int events = 1;
int queriedEvents = 1;
int screen;


void setup(){
  
  size(800,500);
  background(255);
  myData = new ArrayList();
  read_in_data();
  arraySort();
  println(count());
  widgetBorder = color (0,0,0);
  
  
  
  widgetFont=loadFont("Verdana-12.vlw");
  textFont(widgetFont);
  //TextWidget textEdit=new TextWidget(100, 25, 200, 40, "Type a ticker symbol", 
  //color(255), widgetFont, TEXT_WIDGET, 10);
  //focus = null;
  widgetList = new ArrayList<Widget>();
  queries = new ArrayList<Widget>();
  direction = new ArrayList<Widget>();
  screenOne = new Screen(color(255), widgetList,null, null, null);
  screenTwo = new Screen(color(255), direction, queries, null, null);
  screenThree = new Screen (color(255), direction, null, null, null);
  screen = 1;

  int x = 100;
  int y = 100;
  String tickerText = "";
  String previousTicker = "";
  int index = 0;
  
  for(int i = 0 ; i<count(); i++){
    boolean quit = false;
    while(quit == false){
      tickerText=tickers.get(index);
      if(!tickerText.equals(previousTicker)){
        quit = true;
      }
      index++;
    }
    previousTicker=tickerText;
    firstWidget = new Widget(x, y, 60, 30 ,tickerText, color(255,0,0), widgetFont, events);
    focus = null;
    widgetList.add(firstWidget); 
    y+=100;
    if(y>=500){
      y=60;
      x+=100;
    }
    events++;
  }
  Widget openPrice = new Widget (400, 100, 100, 40, "opening price", color(255,0,0), widgetFont, queriedEvents);
  queries.add(openPrice);
  queriedEvents++;
  
   Widget closePrice = new Widget (400, 150, 100, 40, "closing price", color(255,0,0), widgetFont, queriedEvents);
  queries.add(closePrice);
  queriedEvents++;
  
   Widget adjClosePrice = new Widget (400, 200, 160, 40, "adjusted closing price", color(255,0,0), widgetFont, queriedEvents);
  queries.add(adjClosePrice);
  queriedEvents++;
  
   Widget low = new Widget (400, 250, 100, 40, "lowest price", color(255,0,0), widgetFont, queriedEvents);
  queries.add(low);
  queriedEvents++;
  
   Widget high = new Widget (400, 300, 100, 40, "highest price", color(255,0,0), widgetFont, queriedEvents);
  queries.add(high);
  queriedEvents++;
  
   Widget volume = new Widget (400, 350, 100, 40, "stock volume", color(255,0,0), widgetFont, queriedEvents);
  queries.add(volume);
  queriedEvents++;
  
   Widget previous = new Widget (50, 400, 50, 30, "back", color(255,0,0), widgetFont, EVENT_BACKWARD);
   focus = null;
   direction.add(previous);
}
void draw(){
  background(100);
  textSize(12);
  background(255);
  stroke(0);
  fill(255);
  if(screen == 1){
    screenOne.draw();
  }
  else if (screen == 2){
    screenTwo.draw();
  }
  else if (screen == 3){
    screenThree.draw();
  }
}
void mousePressed()
{
  for(int i = 0;i<widgetList.size(); i++)
  {
    Widget myWidget = (Widget)widgetList.get(i);
    event = myWidget.getEvent(mouseX, mouseY);
    
    if(screen == 1)
    {
      event = screenOne.getEvent();
      switch(event)
      {
        case EVENT_TEXT:
        println("clicked");
        focus = (TextWidget)myWidget;
        return;
        
        case 1:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 2:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 3:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 4:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 5:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 6:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 7:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 8:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 9:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 10:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 11:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 12:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 13:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 14:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 15:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 16:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 17:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 18:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 19:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 20:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 21:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 22:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 23:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 24:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 25:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 26:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 27:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 28:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 29:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 30:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 31:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 32:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 33:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 34:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 35:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 36:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 37:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 38:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 39:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 40:
        screen = 2;
        ranges();
        focus = null;
        return;
        
        case 41:
        screen = 2;
        ranges();
        focus = null;
        return;
      }
    }
    else if(screen == 2)
    {
      qEvents = screenTwo.getEvent();
      if(qEvents == EVENT_BACKWARD)
      { 
        screen = 1;
      }
      switch(qEvents){
        case 1:
        screen = 3;
        return;
        
        case 2: 
        screen=3;
        Graph.draw();
        return;
        
        case 3: 
        screen=3;
        Graph.draw();
        return;
        
        case 4: 
        screen=3;
        Graph.draw();
        return;
        
        case 5: 
        screen=3;
       Graph.draw();
        return;
        
        case 6: 
        screen=3;
        Graph.draw();
        return;
      }
   
    }
    else if(screen == 3){
      qEvents = screenTwo.getEvent();
      if(qEvents == EVENT_BACKWARD)
      {
        screen = 2;
      }
    }
  }
}
void keyPressed(){
  if(focus != null)
  {
    focus.append(key);
  }
}

void read_in_data(){
  String lines[] = loadStrings("daily_prices1k.csv");
  
  for(int i = 0; i<lines.length; i++) {
    singularData = new Data(lines[i]);
    myData.add(singularData);
    myNewArray(myData.get(i).myArray);
    
    
  }
}

void myNewArray(String array[]){
  tickers.add(array[0]);
  openingPrices.add(convertToString(array[1]));
  closingPrices.add(convertToString(array[2]));
  adjustedClosingPrices.add(convertToString(array[3]));
  lowestPrices.add(convertToString(array[4]));
  highestPrices.add(convertToString(array[5]));
  volume.add(convertToString(array[6]));
  dates.add(array[7]);
  breakUpDates(array[7]);
}
  
  float convertToString(String points){
    float point = float(points);
    return point;
  }
  
  Integer convertDatesToString(String points){
    int point = int (points);
    return point;
  }
  
  void breakUpDates(String date){
    String array[] = split(date, "-");
    days.add(convertDatesToString(array[0]));
    months.add(convertDatesToString(array[1]));
    years.add(convertDatesToString(array[2]));
  }

    void arraySort(){
      for(int i = 0; i<tickers.size(); i++){
        String myTickers=tickers.get(i);
       for(int index = 0; index<tickers.size(); index++){
       if(tickers.get(index).equals(myTickers)&&i!=index){
  
         
            String removeTicker = tickers.get(index);
            tickers.remove(index);
            tickers.add(i, removeTicker);
            
            float removeClose = closingPrices.get(index);
            closingPrices.remove(index);
            closingPrices.add(i, removeClose);
            
            float removeOpen = openingPrices.get(index);
            openingPrices.remove(index);
            openingPrices.add(i, removeOpen);
            
            float removeAdjusted = adjustedClosingPrices.get(index);
            adjustedClosingPrices.remove(index);
            adjustedClosingPrices.add(i, removeAdjusted);
            
            float removeLowest = lowestPrices.get(index);
            lowestPrices.remove(index);
           lowestPrices.add(i, removeLowest);
            
           float removeHighest = highestPrices.get(index);
            highestPrices.remove(index);
            highestPrices.add(i, removeHighest);
            
            float removeVolume = volume.get(index);
            volume.remove(index);
            volume.add(i, removeVolume);
            
            int removeDay = days.get(index);
           days.remove(index);
            days.add(i, removeDay);
            
            int removeMonth = months.get(index);
            days.remove(index);
            days.add(i, removeMonth);
            
           int removeYear = years.get(index);
            days.remove(index);
           days.add(i, removeYear);
            
         }
      }
      }
    }

    
 int count(){
   int count = 1;
   for(int i = 1; i< tickers.size(); i++){
     String newTicker = tickers.get(i);
     if(!tickers.get(i-1).equals(newTicker)){
       count++;
     }
   }
   return count;
 }
 
 void ranges(){
   range = new ArrayList();
   int count = 1 ;
   for(int i = 1; i<tickers.size(); i++){
     String newTicker = tickers.get(i);
          if(!tickers.get(i-1).equals(newTicker)){
       count++;
          }
          if(count == event){
            range.add(i);

          }
        }
  }

class Data{
  String [] myArray;
  String singularData;
  
  Data(String data){
    singularData = data;
    myArray = splitter(singularData);
  }
  String [] splitter (String lineOfData){
    String myArray[] = split(lineOfData, ",");
    return myArray;
  }
}
  
class Graph{
  ArrayList<Integer> groupedDays;
  ArrayList<Integer> groupedMonths;
  ArrayList<Integer> groupedYears;
  ArrayList<Float> graphPosition;
  int margin, graphHeight, topOfMargin, leftOfMargin, rightOfMargin;
  PFont font;
  String fontList[] = PFont.list();
  PVector[]positions;
  float maximum;
  float minimum;
  float numberOfSpaces;
  
  Graph(){
  }
  
   void draw(){
    qEvents = screenTwo.getEvent();
    switch(qEvents){
      case 1:
      dataPicked(openingPrices);
      return;
      case 2:
      dataPicked (closingPrices);
      return;
      case 3:
      dataPicked(adjustedClosingPrices);
      return;
      case 4:
      dataPicked (lowestPrices);
      return;
      case 5:
      dataPicked(highestPrices);
      return;
      case 6:
      dataPicked (volume);
      return;
    }
    findPosition();
    drawGraph();
    fill(0);
    
    text(tickers.get(range.get(0)),600, 75);
    for(int i = 0; i<positions.length; i++)
    {
      if(mouseX > positions[i].x-5 && mouseX < positions[i].x+5)
      {
        {
          fill(#F00048);
          ellipse(positions[i].x, positions[i].y, 10, 10);
          textSize(24);
          text(groupedYears.get(i), positions[i].x-25, height - margin);
          {
            noStroke();
            fill(255);
            {
              fill(0);
              textSize(12);
              text("date:"+groupedDays.get(i),groupedMonths.get(i),groupedYears.get(i));
              text("value:"+graphPosition.get(i),  positions[i].x-30, positions[i].y+30);
            }
          }
        }
      }
      else {
        fill(200);
        ellipse(positions[i].x, positions[i].y, 15, 15);
      }
    }
  }
  void dataPicked(ArrayList<Float> dataSet){
    groupedDays = new ArrayList();
    groupedMonths = new ArrayList();
    groupedYears = new ArrayList();
    graphPosition = new ArrayList();
    
    if(range.get(0)==1){
      range.add(0, 0);
    }
    
    int lastPieceOfData = range.get(range.size()-1);
    for (int i = range.get(0); i<lastPieceOfData; i++){
      groupedDays.add(days.get(i));
      groupedMonths.add(months.get(i));
      groupedYears.add(years.get(i));
      graphPosition.add(dataSet.get(i));
    }
    int swap = 0;
    int swap2 = 0;
    float swapData = 0;
    float swapData2 = 0;
    
    for(int i = 0; i < groupedYears.size(); i++){
      for(int j = 0; j<(groupedYears.size())-1; j++){
        if(groupedYears.get(j)>groupedYears.get(j+1)){
          swap = groupedYears.get(j);
          swap2 = groupedYears.get(j+1);
          groupedYears.set(j, swap2);
          groupedYears.set(j+1, swap);
          
          swap = groupedMonths.get(j);
          swap2 = groupedMonths.get(j+1);
          groupedMonths.set(j, swap2);
          groupedMonths.set(j+1, swap);
          
          swap = groupedDays.get(j);
          swap2 = groupedDays.get(j+1);
          groupedDays.set(j, swap2);
          groupedDays.set(j+1, swap);
          
          swapData = graphPosition.get(j);
          swapData2 = graphPosition.get(j+1);
          graphPosition.set(j, swapData2);
          graphPosition.set(j+1, swapData);
        }
      }
      for(int j = 0; j<(groupedMonths.size())-1; j++){
        if(groupedMonths.get(j)>groupedMonths.get(j+1) && groupedYears.get(j)>groupedYears.get(j+1)){
          
          swap = groupedDays.get(j);
          swap2 = groupedDays.get(j+1);
          groupedDays.set(j, swap2);
          groupedDays.set(j+1, swap);
          
          swap = groupedMonths.get(j);
          swap2 = groupedMonths.get(j+1);
          groupedMonths.set(j, swap2);
          groupedMonths.set(j+1, swap);
          
          swapData = graphPosition.get(j);
          swapData2 = graphPosition.get(j+1);
          graphPosition.set(j, swapData2);
          graphPosition.set(j+1, swapData);
          
        }
      }
      for(int j = 0; j<(groupedDays.size())-1; j++){
        if(groupedMonths.get(j)>groupedMonths.get(j+1) && groupedDays.get(j)>groupedDays.get(j+1)){
           
          swap = groupedDays.get(j);
          swap2 = groupedDays.get(j+1);
          groupedDays.set(j, swap2);
          groupedDays.set(j+1, swap);
          
           swapData = graphPosition.get(j);
          swapData2 = graphPosition.get(j+1);
          graphPosition.set(j, swapData2);
          graphPosition.set(j+1, swapData);
        }
      }
    }
    }
    void findPosition(){
      positions = new PVector[graphPosition.size()];
      maximum = Collections.max(graphPosition);
      minimum = Collections.min(graphPosition);
      
      margin = 100;
      leftOfMargin = 150;
      rightOfMargin = 100;
      topOfMargin = 250;
      graphHeight = (height - margin)-topOfMargin;
      numberOfSpaces = (width - leftOfMargin - rightOfMargin)/groupedYears.size()-1;
      
      for(int i = 0; i<graphPosition.size(); i++){
        float adjust = map(graphPosition.get(i), minimum, maximum, 0, graphPosition.size());
        float ypos = height-margin-adjust;
        float xpos = margin +(numberOfSpaces *i);
        positions[i] = new PVector(xpos, ypos);
      }
    }
    void drawGraph(){
      for(int i = 0; i< positions.length; i++){
        stroke(100, 100);
        line(positions[i].x, margin, positions[i].x, height-margin);
        String year = Integer.toString(groupedYears.get(i));
        if(i>0){
          stroke(200);
          line(positions[i].x, positions[i].y, positions[i-1].x, positions[i-1].y);
        }
      }
      text(maximum, 5, margin);
      text(minimum, 5, height - margin);
    }
  }
 
 class Screen{
  ArrayList<Widget> widgets = new ArrayList();
  ArrayList<Widget> navigationButtons = new ArrayList();
  ArrayList<Widget> queryList = new ArrayList();
Graph graph;
  
  color screenColour;
  
  Screen(color screenColour, ArrayList<Widget> widgetList,ArrayList<Widget> direction,
  ArrayList<Widget> queries, Graph graph)
  {
    this.screenColour = screenColour;
    widgets = widgetList;
    navigationButtons = direction;
    queryList = queries;
    this.graph = graph;
   
  }
  
  int getEvent(){
    if(widgets != null){
      for(Widget widget: widgets)
      {
        int event = widget.getEvent(mouseX, mouseY);
        if(event!=0)
        return event;
      }
    }
      if(navigationButtons != null){
      for(Widget navigationButton: navigationButtons)
      {
        int event = navigationButton.getEvent(mouseX, mouseY);
        if(event!=0)
        return event;
      }
      }
      if(queryList != null){
      for(Widget myQueries: queryList)
      {
        int event = myQueries.getEvent(mouseX, mouseY);
        if(event!=0)
        return event;
      }
      }
      return EVENT_NULL;
      }
    
      void draw(){
        background(screenColour);
        if(widgets != null)
        {
          for(Widget widget : widgets) {
            color widgetBorder;
           if (mouseX > widget.x && mouseX < widget.x + widget.width
                && mouseY > widget.y && mouseY < widget.y + widget.height){
                    widgetBorder = color(255, 255, 255);
                }
                else{
                    widgetBorder = color(0, 0, 0);
                }
                
          
                stroke(widgetBorder);
                widget.draw();
                
            }
            if(navigationButtons!=null)
            {
            for(Widget navigationButton: navigationButtons) {
            color widgetBorder2;
           if (mouseX > navigationButton.x && mouseX < navigationButton.x + navigationButton.width*2
                && mouseY > navigationButton.y && mouseY < navigationButton.y + navigationButton.height){
                    widgetBorder2 = color(255, 255, 255);
                }
                else{
                    widgetBorder2 = color(0, 0, 0);
        }
        stroke(widgetBorder2);
        navigationButton.draw();
      }
      if(queryList!=null)
      {
        for(Widget myQueries: queryList){
        color widgetBorder3;
           if (mouseX > myQueries.x && mouseX < myQueries.x + myQueries.width
                && mouseY > myQueries.y && mouseY < myQueries.y + myQueries.height){
                    widgetBorder3 = color(255, 255, 255);
                }
                else{
                    widgetBorder3 = color(0, 0, 0);
        }
        stroke(widgetBorder3);
        myQueries.draw();
}
      }
}
}
      }
}     

class Widget{
  ArrayList stockButtons = new ArrayList();
   int x, y, width, height;
  String ticker; 
  int event;
  color widgetColor, labelColor;
  PFont widgetFont;

  Widget()
  {
  }
  Widget(int x, int y, int width, int height, String ticker, 
    color widgetColor, PFont widgetFont, int event) {
    this.x=x; 
    this.y=y; 
    this.width = width; 
    this.height= height;
    this.ticker=ticker; 
    this.event=event;
    this.widgetColor=widgetColor; 
    this.widgetFont=widgetFont;
    labelColor= color(0);
  }
  void draw() {
    fill(widgetColor);
    rect(x, y, width, height);
    fill(labelColor);
    text(ticker, x+10, y+height-10);
  }
  int getEvent(int mX, int mY) {
    if (mX>x && mX < x+width && mY >y && mY <y+height) {
      return event;
    }
    return 0;
  }
}
class TextWidget extends Widget {

  int maxlen;

  TextWidget(int x, int y, int width, int height, String ticker, 
  color widgetColor, PFont widgetFont, int event, int maxlen) {
    super();
    this.x=x; 
    this.y=y; 
    this.width = width; 
    this.height= height;
    this.ticker=ticker; 
    this.event=event;
    this.widgetColor=widgetColor; 
    this.widgetFont=widgetFont;
    labelColor=color(0); 
    this.maxlen=maxlen;
  }
  void append(char s) {
    if (s==BACKSPACE) {
      if (!ticker.equals(""))
        ticker=ticker.substring(0, ticker.length()-1);
    }
    else if (ticker.length() < maxlen)
      ticker=ticker+str(s);
  }
}
1 Like

Graph.draw() is a static reference to a class method. Graph is the class. myGraph is your instance – myGraph.draw() is a non-static reference.

Saying Graph.draw() is like saying “drive Automobiles” instead of “drive my car.” In some cases this makes sense – you can ask for the RegulationBat.length(), and you don’t need to check myBat.length(). But in this case, I don’t think you want to draw the concept of a Graph. You want to draw your graph.