Fill rectangle with pattern in Java Swing
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:
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()));
}
}
![Edward Ruchevits](https://i.stack.imgur.com/Jg3Ed.jpg?s=256&g=1)
Edward Ruchevits
Updated on June 05, 2022Comments
-
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 over 9 yearsis it possible to randomize the positions a little bit?
-
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.