Java:我的paintComponents()方法永远不会被调用

时间:2013-01-23 10:58:03

标签: java swing graphics jpanel paintcomponent

这是我的代码。我有4个类,一个抽象类(GeoShape),一个扩展GeoShape的Rectangle类,一个包含我的GeoShapes并试图绘制它们的GraphicsPanel,以及一个Launcher类。

GeoShape.java

public abstract class GeoShape
{
    protected Point p;
    protected int width, height;

    public GeoShape(Point p, int width, int height)
    {
        this.p = p;
        this.width = width;
        this.height = height;
    }

    public void drawItself(Graphics g)
    {
        g.setColor(Color.BLACK);
    }

    // Getters and setters...
}   

Rectangle.java

public class Rectangle extends GeoShape
{
    public Rectangle(Point p, int width, int height)
    {
        super(p, width, height);    
    }

    @Override
    public void drawItself(Graphics g)
    {
        super.drawItself(g);
        g.drawRect((int)p.getX(), (int)p.getY(), width, height);
    }
}

GraphicsPanel.java

public class GraphicsPanel extends JPanel
{
    private static final long serialVersionUID = 1L;
    private ArrayList<GeoShape> list;

    public GraphicsPanel() 
    {
        list = new ArrayList<GeoShape>();
    }

    @Override
    public void paintComponents(Graphics g) 
    {
        super.paintComponents(g);
        for(int i = 0 ; i < list.size() ; i++) list.get(i).drawItself(g);
    }

    public void addShapeInList(GeoShape s)
    {
        list.add(s);
    }
}

Launcher.java

public class Launcher extends JFrame
{
    private static final long serialVersionUID = 1L;
    private GraphicsPanel panel;

    public Launcher()
    {
        panel = new GraphicsPanel();
        panel.addShapeInList(new Rectangle(new Point(3,9),120,20));
        panel.repaint();

        this.setTitle("Test");
        this.setContentPane(panel);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(700, 500);
        this.setVisible(true);
    }

    public static void main(String[] args) 
    {
        new Launcher();
    }
}

框架中没有任何反应......谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

尝试将其替换为paintComponent而不是paintComponents

public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    for(int i = 0 ; i < list.size() ; i++) list.get(i).drawItself(g);
}