Как вы помещаете метод подкласса в JLabel суперкласса? - PullRequest
1 голос
/ 12 ноября 2009

Итак, вот класс и супер класс, вопрос для подражания:

TestDraw:

package project3;

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestDraw extends MyShape
{
    public static void main(String[] args) 
    {
        DrawPanel panel = new DrawPanel();
        JFrame application = new JFrame();



        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        application.add(panel);
        application.setSize(300,300);
        application.setVisible(true);   
        JLabel southLabel = new JLabel(toString());
        application.add(southLabel, BorderLayout.SOUTH);
    }
}

MyShape:

package project3;

import java.awt.Color;

public class MyShape 
{
    private int x1, y1, x2, y2;
    private Color myColor;
    public MyShape()
    {
        setX1(1);
        setY1(1);
        setX2(1);
        setY2(1);
        setMyColor(Color.BLACK);
    }
    public MyShape(int x1, int y1, int x2, int y2, Color myColor)
    {
        setX1(x1);
        setY1(y1);
        setX2(x2);
        setY2(y2);
        setMyColor(myColor);
    }
    public void setX1(int x1)
    {
        if(x1 >= 0 && x1 <= 300)
        {
            this.x1 = x1;
        }
        else
        {
            this.x1 = 0;
        }
    }
    public int getX1()
    {
        return x1;
    }
    public void setY1(int y1)
    {
        if(y1 >= 0 && y1 <= 300)
        {
            this.y1 = y1;
        }
        else
        {
            this.y1 = 0;
        }
    }
    public int getY1()
    {
        return y1;
    }
    public void setX2(int x2)
    {
        if(x2 >= 0 && x2 <= 300)
        {
            this.x2 = x2;
        }
        else
        {
            this.x2 = 0;
        }
    }
    public int getX2()
    {
        return x2;
    }
    public void setY2(int y2)
    {
        if(y2 >= 0 && y2 <= 300)
        {
            this.y2 = y2;
        }
        else
        {
            this.y2 = 0;
        }
    }
    public int getY2()
    {
        return y2;
    }
    public void setMyColor(Color myColor)
    {
        this.myColor = myColor;
    }
    public Color getMyColor()
    {
        return myColor;
    }
    public String toString()
    {
        return String.format("X1: %d, X2: %d, Y1: %d, Y2: %d, Color: %s", getX1(), getX2(),
                getY1(), getY2(), getMyColor());
    }
}

В классе TestDraw я пытался поместить toString из MyShape в текстовое поле на окне, но когда я сделал «JLabel southLabel = new JLabel (toString ());» он сказал, что мой toString () должен быть статическим. Это все прекрасно, но когда вы делаете toString статическим, он хочет, чтобы значения в этой строке были статичными, что плохо ... какие-нибудь идеи?

Я пытался поместить toString () в суперкласс, но это дает ту же проблему, пытался задать вопрос учителю, но он говорит: «Посмотрите в книге». Хорошо… прошло два часа чтения главы, и я еще не нашел пример после третьего прочтения.

Заранее спасибо!

PS: Ответ хорош, но объяснение предпочтительнее!

Ответы [ 2 ]

3 голосов
/ 12 ноября 2009

Сделайте экземпляр вашего класса.
TestDraw testDraw = new TestDraw();
и вызовите для него метод toString (). Находясь в методе main, вы находитесь в статическом контексте, то есть у вас нет объекта типа TestDraw, что также означает, что у вас нет ни одного из его полей или методов.

1 голос
/ 12 ноября 2009

Это потому, что вы вызываете нестатический метод внутри статического (основного). Это не сработает. Вместо этого вам нужно создать экземпляр объекта TestDraw следующим образом:

TestDraw testDraw = new TestDraw();
JLabel southLabel = new JLabel(testDraw.toString());
...