10

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)

Edward Ruchevits
  • 6,411
  • 12
  • 51
  • 86

2 Answers2

13

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.

Tilman Hausherr
  • 17,731
  • 7
  • 58
  • 97
wchargin
  • 15,589
  • 12
  • 71
  • 110
  • is it possible to randomize the positions a little bit? – wutzebaer Feb 15 '15 at 13:39
  • @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. – wchargin Feb 15 '15 at 15:52
3

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()));
    }
}
IvanRF
  • 7,115
  • 5
  • 47
  • 71