Sk4llsRPG
Sk4llsRPG

Reputation: 259

Java paintComponent as a JComponent

Don't know if it was a very specific title, but I have already asked this question but has gone dead. I am trying to execute paintComponent() so I can draw rectangles, triangles and more with the class being a JComponent.

Here is my code so far:

public class Design extends JComponent {
private static final long serialVersionUID = 1L;

private List<ShapeWrapper> shapesDraw = new ArrayList<ShapeWrapper>();
private List<ShapeWrapper> shapesFill = new ArrayList<ShapeWrapper>();

GraphicsDevice gd =     GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
int screenWidth = gd.getDisplayMode().getWidth();
int screenHeight = gd.getDisplayMode().getHeight();

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    for(ShapeWrapper s : shapesDraw){
        g2d.setColor(s.color);
        g2d.draw(s.shape);
    }
    for(ShapeWrapper s : shapesFill){
        g2d.setColor(s.color);
        g2d.fill(s.shape);
    }
}

public void drawRect(int xPos, int yPos, int width, int height) {
    shapesDraw.add(new Rectangle(xPos, yPos, width, height));
    repaint();
}

public void fillRect(int xPos, int yPos, int width, int height) {
    shapesFill.add(new Rectangle(xPos, yPos, width, height));
    repaint();
}

public void drawTriangle(int leftX, int topX, int rightX, int leftY, int topY, int rightY) {
    shapesDraw.add(new Polygon(
            new int[]{leftX, topX, rightX},
            new int[]{leftY, topY, rightY},
            3));
    repaint();
}

public void fillTriangle(int leftX, int topX, int rightX, int leftY, int topY, int rightY) {
    shapesFill.add(new Polygon(
            new int[]{leftX, topX, rightX},
            new int[]{leftY, topY, rightY},
            3));
    repaint();
}


public Dimension getPreferredSize() {
    return new Dimension(getWidth(), getHeight());
}

public int getWidth() {
    return screenWidth;
}
public int getHeight() {
    return screenHeight;
}

}

class ShapeWrapper {

    Color color;
    Shape shape;

    public ShapeWrapper(Color color , Shape shape){
        this.color = color;
        this.shape = shape;
    }
}

As shown above, everything works perfectly fine, except for being able to choose a colour. I want to be able to define the rectangles and triangles with their respective positions and lengths but also want to add a colour with it.

But I get an error.

The error says:

The method add(ShapeWrapper) in the type List< ShapeWrapper > is not applicable for the arguments (Rectangle)

And:

The method add(ShapeWrapper) in the type List< ShapeWrapper > is not applicable for the arguments (Polygon)

Please help! I am so stressed trying to figure this out as it is blocking me from doing many things.

Upvotes: 2

Views: 99

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347184

The answer is pretty basic...Shape is not a type of ShapeWrapper, therefore it can't be added to a List decalred as List<ShapeWrapper>

What you should be doing instead of

shapesDraw.add(new Rectangle(xPos, yPos, width, height));

is something more like...

shapesDraw.add(new ShapeWrapper(Color.BLACK, new Rectangle(xPos, yPos, width, height)));

The same goes for your ...Triangle methods. You need to wrap the resulting Polygon in a ShapeWrapper before trying to add it to the List

Upvotes: 4

Related Questions