我的任务是绘制宽度和宽度随机的水平线。当我运行程序时,厚度会部分改变。我不知道怎么可能,因为我先设置宽度然后画线。我没有更新,所以据我所知我不会重画线。程序中唯一的其他代码是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]);
}
}
}
最佳答案
每次重新绘制小程序时(可能由于窗口移动,最小化和还原,或者被另一个窗口遮挡然后显示出来),都会再次调用paint
方法,因此将创建new Random()
并将以新的随机粗细绘制线条。如果您不希望发生这种情况,可以采取几种方法。
屏幕外缓冲区
您可以使用createImage
方法创建一个缓冲区来绘制线条。使用其getGraphics
方法获取Graphics
对象,绘制线条,然后在您的paint
方法中,使用传递给drawImage对象的Graphics
方法在屏幕上绘制此缓冲区。 cc>。将屏幕外缓冲区声明为applet类的字段。因为您只需要在缓冲区上绘制一次,所以小程序被重绘多少次都没有关系。
随机数数组paint
方法中有两个地方可以调用paint
。您可以创建两个大小为rand.nextInt
的int[]
数组,将它们声明为applet的字段,然后使用linesNum
对象在init
方法中填充它们。然后,在您的Random
方法中,而不是生成随机数,只需重新使用您以前存储在这些数组中的那些即可。这样,无论您的小程序被重画了多少次,您都将获得相同的结果。
播种随机数生成器
在您的paint
方法中,创建一个paint
对象。您可以通过调用将种子作为参数的构造函数或对其调用new Random()
方法来为随机数生成器(RNG)设置种子。如果使用相同的种子,则将始终获得相同的伪随机数序列。如果您希望小程序的每次运行都具有不同的随机线宽(但每次重绘时都不希望它们改变),则可以创建一个setSeed
对象,并在小程序启动时使用其Random
方法选择随机种子。 ,将该种子存储在applet类的字段中,然后使用它在nextLong
方法中为RNG种子。这样,每次调用paint
时,您将获得相同的随机数序列。
关于java - 为什么我的笔触厚度发生变化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28796355/