Fill rectangle with pattern in Java Swing

10,723

Solution 1

You're on the right track with setPaint. However, instead of setting it to a color, you want to set it to a TexturePaint object.

From the Java tutorial:

The pattern for a TexturePaint class is defined by a BufferedImage class. To create a TexturePaint object, you specify the image that contains the pattern and a rectangle that is used to replicate and anchor the pattern. The following image represents this feature: example image

If you have a BufferedImage for the texture, create a TexturePaint like so:

TexturePaint tp = new TexturePaint(myImage, new Rectangle(0, 0, 16, 16));

where the given rectangle represents the area of the source image you want to tile.

The constructor JavaDoc is here.

Then, run

g2d.setPaint(tp);

and you're good to go.

Solution 2

As @wchargin said, you can use TexturePaint. Here is an example:

public class TexturePanel extends JPanel {

    private TexturePaint paint;

    public TexturePanel(BufferedImage bi) {
        super();
        this.paint = new TexturePaint(bi, new Rectangle(0, 0, bi.getWidth(), bi.getHeight()));
    }

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(paint);
        g2.fill(new Rectangle(0, 0, getWidth(), getHeight()));
    }
}
Share:
10,723
Edward Ruchevits
Author by

Edward Ruchevits

Updated on June 05, 2022

Comments

  • Edward Ruchevits
    Edward Ruchevits about 2 years

    I know how to fill a rectangle in Swing with a solid color:

    Graphics2D g2d = bi.createGraphics();
    g2d.setColor(Color.RED);
    g2d.fillRect(0,0,100,100);
    

    I know how to fill it with an image:

    BufferedImage bi;
    Graphics2D g2d = bi.createGraphics();
    g2d.setPaint (new Color(r, g, b));
    g2d.fillRect (0, 0, bi.getWidth(), bi.getHeight());
    

    But how to fill rectangle of size 950x950 with some tiled pattern of size 100x100?

    (pattern image should be used 100 times)

  • wutzebaer
    wutzebaer over 9 years
    is it possible to randomize the positions a little bit?
  • wchargin
    wchargin over 9 years
    @wutzebaer Not with a texture paint, no. There isn't a concept of "positions" (of, presumably, the circles); the circles are just part of the image, which gets tiled. If you actually want this specific pattern but with randomized circles, you could draw it procedurally: first fill your canvas with the background color, then fill rows of circles, and perturb them slightly from the nominal positions.