Rocketsm46
Rocketsm46

Reputation: 21

How to fix java error?

So I have to create a program where I use polymorphism and inheritance to create arrows that point left and arrow and I did that. however, when I created my main class and try to invoke the methods, say for example "LeftArrow.drawHere" to draw the arrow i get errors saying I cannot make a static reference to the non static field "drawHere() from the class LeftArrow". I was wondering then if I can't do that how can I design my main method so it draws the arrows? here is my code, note that there are several classes but I will post all of them here.

import java.util.Scanner;

public class LeftArrow extends ShapeBasic
{
    private int tail, width;
    private static int inside;
    public LeftArrow()
    {
        super();
        tail = 0;
        width = 0;
    }
    public LeftArrow(int noff, int ntail, int nwidth)
    {
        super(noff);
        tail = ntail; 
        setWidth(nwidth);
    }

    public void setTail(int ntail)
    {
        tail = ntail;
    }

    public int getTail()
    {
        return tail;
    }
    public void setWidth(int nwidth)
    {
        if (nwidth % 2 == 1)
        {
            width = nwidth;
        }
        else
        {
            System.out.println(" Width must be odd");
            System.out.println("Enter a new width");
            Scanner key = new Scanner(System.in);
            int wid = key.nextInt();
            setWidth(wid);
        }
    }
    public int getWidth()
    {
        return width;
    }
    public void drawHere() 
    {
        drawTriangle();
        drawTail();
        drawBTriangle();
        //System.out.println();
    }
    public void drawTriangle()
    {
        inside = 1;
        int split = (width/2);
        skipSpaces(getOffset());
        System.out.println('*');
        for(int count = 0; count < split; count ++)
        {
            skipSpaces(getOffset() - (inside + 1));
            System.out.print('*');
            skipSpaces(inside);
            System.out.print('*');
            inside = inside + 2;
            System.out.println();
        }
    }
    public void drawTail()
    {
        skipSpaces(getOffset() - getInside() - 1);
        System.out.print('*');
        skipSpaces(getInside());
        for (int count = 0; count < tail ; count++)
        { 
            System.out.print('*');
        }
    }
    public void drawBTriangle()
    {
        int inside = getInside();
        int split = (width/2);
        System.out.println();
        for(int count = 0; count < split; count ++)
        {
            skipSpaces(getOffset() - (inside - 1));
            System.out.print('*');
            inside = inside - 2;
            skipSpaces(inside);
            System.out.print('*');
            System.out.println();
        }
        skipSpaces(getOffset());
        System.out.print('*');
    }
    public int getInside()
    {
        return inside;
    }
    private static void skipSpaces(int number)
    {
        for (int count = 0; count < number; count++)
            System.out.print(' ');
    }
    @Override
    public void setOffset(int noff) {
        // TODO Auto-generated method stub

    }
    @Override
    public int getOffset() {
        // TODO Auto-generated method stub
        return 0;
    }
}

import java.util.Scanner;

public class RightArrow extends ShapeBasic
{
    private int tail, width;
    private static int inside;
    public RightArrow()
    {
        super();
        tail = 0;
        width = 0;  
    }
    public RightArrow(int noff, int ntail, int nwidth)
    {
        super(noff);
        tail = ntail;
        setWidth(nwidth); // must be odd
    }
    public void setTail(int ntail)
    {
        tail = ntail;
    }
    public int getTail()
    {
        return tail;
    }
    public void setWidth(int nwidth)
    {
        if (nwidth % 2 == 1)
        {
            width = nwidth;
        }
        else
        {
            System.out.println(" Width must be odd");
            System.out.println("Enter a new width");
            Scanner key = new Scanner(System.in);
            int wid = key.nextInt();
            setWidth(wid);
        }
    }
    public int getWidth()
    {
        return width;
    }
    public void drawHere()
    {
        drawTriangle();
        drawTail();
        drawBTriangle();
        System.out.println();
    }
    public void drawTail()
    {
        skipSpaces(getOffset() + 1);
        for (int count = 0; count < tail ; count++)
        { 
            System.out.print('*');
        }
        skipSpaces(getInside());
        System.out.print('*');  // fix
    }
    public void drawTriangle()
    {
        inside = 1;
        int split = (width/2);
        skipSpaces(getOffset() + tail);
        System.out.println('*');
        for(int count = 0; count < split; count ++)
        {
            skipSpaces(getOffset() + tail);
            System.out.print('*');
            skipSpaces(inside);
            System.out.print('*');
            inside = inside + 2;
            System.out.println();
        }
    }
    public void drawBTriangle()
    {
        int inside = getInside();
        int split = (width/2);
        System.out.println();
        for(int count = 0; count < split; count ++)
        {
            skipSpaces(getOffset() + tail);
            System.out.print('*');
            inside = inside - 2;
            skipSpaces(inside);
            System.out.print('*');
            System.out.println();
        }
        skipSpaces(getOffset() + tail);
        System.out.print('*');
    }
    public int getInside()
    {
        return inside;
    }
    private static void skipSpaces(int number)
    {
        for (int count = 0; count < number; count++)
            System.out.print(' ');
    }
}

public abstract class ShapeBase implements ShapeInterface {
    private int offset;
    public abstract void drawHere();


    public void drawAt(int lineNumber) {
        for (int count = 0; count < lineNumber; count++)
            System.out.println();
        drawHere();
    }
}

public class ShapeBasic implements ShapeInterface
{

    private int offset;

    public ShapeBasic()
    {
        offset = 0;
    }
    public ShapeBasic( int noff)
    {
        offset = noff;
    }
    public void setOffset(int noff) 
    {
        offset = noff;
    }

    public int getOffset() 
    {
        return offset;
    }

    public void drawAt(int linnumber) 
    {
        for (int count = 0; count < linnumber; count++)
            System.out.println();
        drawHere();
    }

    public void drawHere() 
    {
        for (int count = 0; count < offset; count++)
            System.out.print(' ');
        System.out.println('*');
    }

}

public interface ShapeInterface 
{
    public void setOffset(int noff);    // set how many space from left

    public int getOffset(); // returns offset
    public void drawAt(int linnumber);  // moves down equal to line number Ex. 5 = 5 down
    public void drawHere(); // draws shape after moving left equal to offset
}

Upvotes: 1

Views: 261

Answers (3)

Simon Zambrovski
Simon Zambrovski

Reputation: 756

The method drawHere is declared as non-static. Instead of LeftArrow.drawHere() you should call

  LeftArrow left = new LefArrow(a, b, c);
  left.drawHere();

Upvotes: 1

DaaaahWhoosh
DaaaahWhoosh

Reputation: 379

I'd ask to see your main method, but I don't have the reputation. At a guess, I'd say maybe you are not actually instantiating objects of these classes in your main method, but trying to call the methods from them. If, for instance, you do this:

LeftArrow lArrow = new LeftArrow();
lArrow.drawHere();

it should work.

Upvotes: 1

Christopher Helck
Christopher Helck

Reputation: 1140

main is static. It needs to create instances of LeftArrow before it can use them. Something like this:

LeftArrow myArrow = new LeftArrow();
myArrow.drawHere();

Upvotes: 0

Related Questions