用于 JPanel 操作的基于 RGB 的随机颜色 setter 不起作用,颜色始终为黑色

RGB based random color setter for JPanel manipulation doesn't work, the color is always black

我编写代码使用 RGB 生成随机颜色并用它填充多边形,以便使用“util.Random”每个多边形都是不同的颜色。但是,每次我 运行 这段代码时,所有 8 个多边形都会被黑色填充。 xxx 是 JPanel 的变量名。

public void randcol(){
        Graphics g = xxx.getGraphics();
        Random r = new Random();
        int rand1 = r.nextInt(256);
        int rand2 = r.nextInt(256);
        int rand3 = r.nextInt(256);
        g.setColor(new Color(rand1, rand2, rand3));
    }
    public void colorize(){
        Graphics g = xxx.getGraphics();
        randcol(); 
        g.fillPolygon(tr1);
        randcol();
        g.fillPolygon(tr2);
        randcol();
        g.fillPolygon(tr3);
        randcol();
        g.fillPolygon(tr4);
        randcol();
        g.fillPolygon(tr5);
        randcol();
        g.fillPolygon(tr6);
        randcol();
        g.fillPolygon(tr7);
        randcol();
        g.fillPolygon(tr8);
    }

你可以写一个函数来给你随机颜色

public Color getRandomColor(){
    Random r = new Random();
    int rand1 = r.nextInt(256);
    int rand2 = r.nextInt(256);
    int rand3 = r.nextInt(256);
    return new Color(rand1, rand2, rand3);
}

public void colorize(){
   Graphics g = xxx.getGraphics();
   g.setColor(getRandomColor());
   g.fillPolygon(tr1);
   g.setColor(getRandomColor());
   g.fillPolygon(tr2);
   g.setColor(getRandomColor());
   //...
}
public void randcol(){
    Graphics g = xxx.getGraphics();
    ...
}

public void colorize(){
    Graphics g = xxx.getGraphics();
    ...

当您调用 getGraphics() 时,您每次都会获得不同的 Graphics 对象实例。所以你不能用不同的方法设置 Graphics 对象的 Color。

相反,您 randcol() 方法应该 return 一个 Color 对象。 colorize() 方法将在绘制多边形之前调用此方法来设置 Graphics 对象的颜色。

然而,这仍然是错误的做法,因为 Swing 组件可以被多次绘制,每次重新绘制时,您当前的逻辑都会再次随机化颜色。

因此,正确的解决方案是创建一个包含以下内容的自定义对象:

  1. 要绘制的多边形
  2. 多边形的颜色。

该对象应该在您的 class 开始时生成一次。然后你将所有这些对象保存在一个 ArrayList 中,你的绘画方法遍历 ArrayList 来绘制每个对象。

有关此方法的工作示例,请参阅:Custom Painting Approaches