【问题标题】:Why is my brushstroke thickness changing?为什么我的笔触粗细会发生变化?
【发布时间】:2015-03-01 17:00:16
【问题描述】:

我的任务是随机绘制宽度和粗细的水平线。当我运行我的程序时,厚度会部分改变。我不明白这是怎么可能的,因为我是在设置宽度然后画线。我不更新,所以据我所知,我不会重画这条线。程序中唯一的其他代码是 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]);

    }

}

}

【问题讨论】:

  • 你明白这个方法会被再次调用,从而绘制不同值的不同线条,每次你的小程序被重新绘制时,比如如果窗口被遮挡和未被覆盖,不是吗?
  • 我不是,这清楚了谢谢你:)

标签: java variable-assignment graphics2d


【解决方案1】:

每次重新绘制小程序时,可能由于窗口移动、最小化和恢复,或者被另一个窗口遮挡然后显示,都会再次调用paint方法,从而创建一个@ 987654322@ 并将以新的随机厚度重新绘制线条。如果您不希望这种情况发生,您可以采取一些方法。

离屏缓冲区

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

随机数数组

paint 方法中有两个地方调用rand.nextInt;您可以创建两个大小为linesNumint[] 数组,将它们声明为applet 的字段,然后使用Random 对象将它们填充到init 方法中。然后,在您的 paint 方法中,不要生成随机数,而是重新使用您之前存储在这些数组中的那些。这样,无论您的小程序重绘多少次,您都会得到相同的结果。

播种随机数生成器

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

【讨论】:

  • 非常感谢你,我会支持你,但我没有这样做的特权:/我最终使用了你建议的随机数数组。
  • 你应该仍然能够接受答案,如果你这样选择的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多