【问题标题】:Fill a shape with a random color in java在java中用随机颜色填充形状
【发布时间】:2026-02-12 13:05:01
【问题描述】:

在我正在做的这个程序中,我需要能够用随机颜色填充形状。我对如何实际填充形状感到困惑。我能够生成随机颜色。我在网上四处查看,发现一些消息来源谈论实现Paint 接口并在您希望绘制的形状上使用setPaint() 方法,然后调用fill 方法。我试过这个但没有成功。也许我只是弄错了。这就是我所拥有的。

Random rand = new Random();
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();

Color randomColor = new Color (r, g, b);

这是在一个超类的构造函数中,我实际上将randomColor 作为该类的属性。因此,为了访问子类中的那个元素,我提供了一个基本的 getter,它只返回颜色。

在子类中我有这个:

Rectangle2D.Double rectangle = new Rectangle2D.Double(getX(), getY(), getWidth(), height);
rectangle.setPaint(getColor());
rectangle.fill();
g2.draw(rectangle);

我得到的错误是关于类型转换rectangle 但我尝试的任何类型转换都不起作用。我不确定如何解决这个问题。有任何想法吗?或者有没有更简单/更好的方法来填充随机颜色的形状?谢谢。

【问题讨论】:

  • rand.nextInt(256); 不是更有意义吗?
  • 类型转换与随机颜色无关。向我们展示您得到的确切错误以及其中的代码。

标签: java graphics colors


【解决方案1】:

你应该调用你在 Graphics2D 上的矩形上调用的方法

Rectangle2D.Double rectangle = new Rectangle2D.Double(getX(), getY(), getWidth(), height);
g2.setPaint(getColor());
g2.fill(rectangle);
g2.draw(rectangle);

【讨论】:

  • 太棒了!有效。太感谢了。这比我尝试做的要容易得多。你怎么知道在 g2 而不是 rectangle 上使用 setPaintfill 方法?
  • 我确实有另一个问题,我现在在我的程序中注意到了一些问题。在我用颜色填充形状之前,我使用它的方式是,当您单击形状时,形状会向下和向右平移 1 个像素,然后重绘多次以显示它已被“选中”。这是它的样子(这实际上是我的屏幕,所以这是我当前正在运行的程序):gyazo.com/0af4f9b88acdaf682f763a255df38202 我现在遇到的问题是整个形状都充满了一种颜色,所以当它被选中时,它只是用相同的颜色重新绘制,所以你无法分辨。
  • 我想知道如何用随机颜色填充形状,然后用黑色勾勒出形状仍然被填充的方式,但是当你选择它时,你会得到重新绘制的小东西。我是图形编程的新手,所以我还在学习一些东西。这是它现在的样子:gyazo.com/b172d939963106d9ba4290e81320d77e
  • 在你的 fill(rect) 调用之后,执行 setPaint(outlineColor) draw(rect)
【解决方案2】:

我需要能够用随机颜色填充形状

那么你应该创建一个包含两个属性的类(ColoredShape):

  1. 形状
  2. 颜色

然后你可以创建一个 ArrayList 来保存这个类的实例。

ArrayList<ColoredShape> shapes = new ArrayList<ColoredShape>();
shapes.add( new ColoredShape(aShape, generateRandomColor());
shapes.add( new ColoredShape(anotherShape, generateRandomColor());

然后在面板的 paintComponent() 方法中遍历 ArrayList 并绘制所有形状:

for (ColoredShape shape: shapes)
{
    g2.setColor(shape.getColor());
    g2.draw(shape.getShape());
}

有关此方法的工作示例,请查看Custom Painting Approaches 中的DrawOnComponent 示例。

【讨论】:

  • 我认为这是一个错误:ArrayList shapes = new ArrayList();
  • @ControlAltDel,哎呀,已修复 :)