Search code examples
javaswinggraphicsjpanelpaintcomponent

Java : My paintComponents() method is never called


Here is my code. I have 4 classes, an abstract class (GeoShape), a Rectangle class that extends GeoShape, a GraphicsPanel containing my GeoShapes and trying to draw them, and a Launcher class.

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();
    }
}

And nothing happens in the frame... thanks for your help.


Solution

  • Try to replace it with paintComponent rather than paintComponents

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