Java 用于JPanel操作的基于RGB的随机颜色设置器';不行,颜色总是黑色的

Java 用于JPanel操作的基于RGB的随机颜色设置器';不行,颜色总是黑色的,java,swing,jframe,Java,Swing,Jframe,我编写了使用RGB生成随机颜色的代码,并用它填充多边形,所以每个多边形使用“util.random”都是不同的颜色。然而,每次我运行这段代码时,所有8个多边形都会被黑色填充。xxx是JPanel的变量名 public void randcol(){ Graphics g = xxx.getGraphics(); Random r = new Random(); int rand1 = r.nextInt(256); int rand

我编写了使用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());
   //...
}
调用
getGraphics()
时,每次都会得到图形对象的不同实例。因此,不能用其他方法设置图形对象的颜色

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

但是,这仍然是错误的方法,因为Swing组件可以绘制多次,并且每次重新绘制时,当前逻辑将再次随机化颜色

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

  • 要绘制的多边形
  • 多边形的颜色
  • 这个对象应该在类开始时生成一次。然后,将所有这些对象保留在ArrayList中,绘制方法会在ArrayList中迭代以绘制每个对象

    请参阅:此方法的工作示例。

    Random r=new Random()将提供相同的颜色序列。原因是“随机”实际上是基于当前时间(以毫秒为单位)的伪随机。从这个“种子”中,它将产生一个可复制(使用相同种子)的数字序列。解决方案是将其声明为类属性,并同时或在构造函数中实例化。
    
    public void randcol(){
        Graphics g = xxx.getGraphics();
        ...
    }
    
    public void colorize(){
        Graphics g = xxx.getGraphics();
        ...