为什么我的笔刷厚度会改变?

时间:2015-03-01 17:00:17

标签: java variable-assignment graphics2d

我的任务是在宽度和随机线条粗细中随机绘制水平线。当我运行程序时,厚度会发生变化。我不明白这是怎么可能的,因为我设置宽度然后画线。我没有更新,所以据我所知,我没有重新划线。程序中唯一的其他代码是init(),因为我们必须在applet中执行它。

public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.red);
    int increment = 70; // space between lines
    int linesNum = 5; // number of lines were drawing
    Random rand = new Random();
    int randW;

    Line2D.Float[] lines = new Line2D.Float[linesNum];
    for (int y = 0; y < linesNum; y++) {
        // where we are at on they axis
        int yoffset = (increment * y) + increment;
        // random width of line max 499 min 50
        randW = rand.nextInt((499 - 5) + 1) + 5;
        // random thick line
        g2.setStroke(new BasicStroke(rand.nextInt((increment - 10) + 1) + 5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        lines[y] = new Line2D.Float(1, yoffset, randW, yoffset);
        g2.draw(lines[y]);

    }

}

}

1 个答案:

答案 0 :(得分:0)

每次重新绘制applet时,可能由于窗口移动,最小化和恢复,或被另一个窗口遮挡然后显示而导致,paint方法将再次被调用,因此将创建a new Random()并将以新的随机厚度重新绘制线条。如果您不希望这种情况发生,可以采取一些方法。

离屏缓冲区

您可以使用createImage方法创建一个缓冲区来绘制线条。使用其getGraphics方法获取Graphics对象,绘制线条,然后在paint方法中使用drawImage方法在屏幕上绘制此缓冲区{1}}传递给Graphics的对象。将屏幕外缓冲区声明为applet类的字段。由于您只需要在缓冲区上绘制一次,因此重新绘制applet的次数并不重要。

随机数组

paint方法中有两个地方可以调用paint;您可以创建两个大小为rand.nextInt的{​​{1}}数组,将它们声明为applet的字段,并使用int[]对象在linesNum方法中填充它们。然后,在init方法中,只需重复使用之前存储在这些数组中的随机数,而不是生成随机数。这样,无论你的applet重画多少次,你都会得到相同的结果。

种子随机数生成器

Random方法中,您可以创建一个paint对象。您可以通过调用以种子作为参数的构造函数或在其上调用paint方法来对随机数生成器(RNG)进行种子设定。如果您使用相同的种子,您将始终获得相同的伪随机数序列。如果您希望applet的每次运行具有不同的随机线宽(但不能在每次重绘时更改它们),您可以创建一个new Random()对象并使用其setSeed方法来选择随机种子当您的applet启动时,将该种子存储在applet类的字段中,然后使用它在Random方法中为RNG设定种子。这样,每次调用nextLong时,您都会获得相同的随机数序列。