首页 > 解决方案 > 用于 JPanel 操作的基于 RGB 的随机颜色设置器不起作用,颜色始终为黑色

问题描述

我编写了代码来使用 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);
    }

标签: javaswingjframe

解决方案


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

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

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

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

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

因此,正确的解决方案是创建一个自定义对象,其中包含:

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

该对象应在课程开始时生成一次。然后将所有这些对象保存在 ArrayList 中,并且您的绘制方法会遍历 ArrayList 以绘制每个对象。

有关此方法的工作示例,请参阅:自定义绘画方法。


推荐阅读