【问题标题】:How to draw rectangles using a loop?如何使用循环绘制矩形?
【发布时间】:2016-08-10 11:59:39
【问题描述】:

我需要创建一个循环,在垂直线上绘制具有交替颜色(例如黑色、白色、黑色、白色)的矩形。谁能告诉我这是怎么做到的?

我尝试了很多方法,但似乎无法让循环工作,谢谢。

for (int x = 0; x>10;x++) {
    int y= 180;
    graph2D.drawRect(170, y, 20, 50);
    y = y + 45;
}

这就是我所拥有的,由于某种原因它不会绘制矩形,而且我无法让它交替颜色。

【问题讨论】:

  • 我们可能需要查看更多代码,因为它不起作用。你能画一个没有循环的矩形吗?
  • 首先,您在每次进入循环时重新初始化y,这样方块就会相互重叠。尝试在循环之前移动int y = 180;,看看你会得到什么。从那里您可以处理颜色和其他问题
  • String color = x%2 == 0 ? "black" : "white"。像这样的颜色变化。

标签: java swing object for-loop colors


【解决方案1】:

为什么你使用y 变量而不是你正在循环的x?

@Override
public void paint(Graphics graph2D) {
    for (int y=0; y<10; y++) {
        int height = 50;
        if (y%2==0) {
            graph2D.setColor(Color.white);
        } else {
            graph2D.setColor(Color.black);
        }
        graph2D.fillRect(170, 180 + y*height, 20, 50);
    }
}

在绘制矩形时也要注意区别:

  • .drawRect(..) 绘制矩形的边框。
  • .fillRect(..) 自己绘制矩形。

如果您想在black 和white 颜色之间切换,请在每个循环中更改颜色。循环的每个偶数y%2 == 0 将具有一种颜色,否则为第二种颜色(在上面的代码中也提到过):

if (y%2==0) {
    graph2D.setColor(Color.white);
} else {
    graph2D.setColor(Color.black);
}

【讨论】:

  • static final int 可能比简单的 int 稍微好一点——它是一个编译时常量,最好不要让 JVM 来识别它。
  • @SándorMátyásMárton 你在说什么?
  • @MatthewCliatt 这是关于height的旁白,循环变量当然不是编译时间常数:)
  • @SándorMátyásMárton 哦,当然,我不知道为什么我没有立即意识到你的意思。
【解决方案2】:

这里有一些问题。

您的for loop 不会执行任何迭代,因为您的条件是x &gt; 10 而不是x &lt; 10。

将第一行改为:

for (int x = 0; x>10;x++){

收件人:

for (int x = 0; x < 10; x++) {

此外,您每次迭代都将y 重置为 180,因此一旦您的循环开始,所有矩形将被绘制在彼此的顶部。在循环外声明y,或使用x 计算矩形位置。

像这样:

int y = 180;
for (int x = 0; x < 10; x++) {
    graph2D.drawRect(170, y, 20, 50);
    y = y + 45;
}

或者像这样:

for (int x = 0; x < 10; x++) {
    graph2D.drawRect(170, (x * 45) + 180, 20, 50);
}

上面的数学(x * 45) + 180是一种超级简单的说法,即第一个矩形将在(x * 45) + 180 = 0 + 180 = 180,第二个将在(x * 45) + 180 = 45 + 180 = 225等等。

要更改矩形的颜色,您需要创建一个 Colors 列表或数组,并在每次迭代中使用列表中的不同 Color。

//Make the list
Color[] colors = {Color.black, Color.blue, Color.cyan, Color.darkGray,
                  Color.green, Color.lightGray, Color.magenta, Color.magenta,
                  Color.orange, Color.pink, Color.red, Color.white, Color.yellow};

//Draw each rectangle
for (int x = 0; x < 10; x++) {

    //Change the color
    g.setColor(colors[x]);

    //Draw the rectangle
    graph2D.drawRect(170, (x * 45) + 180, 20, 50);
}

当然,如果您希望颜色是随机的,您可以考虑使用 Random 类,并生成一个介于 0 和 colors 数组长度之间的随机数。另请注意,我使用x 作为colors 数组的索引,如果您的循环将x 递增到高于数组中的颜色数,您将得到一个ArrayIndexOutOfBoundsException。

我还假设您将Graphics 的实例命名为g,因为大部分时间都是这样做的。

【讨论】:

  • 谢谢马修,我将如何做到让矩形填充在循环中,而不仅仅是改变颜色的轮廓?我没想过要使用数组,所以谢谢
  • 没问题,要使矩形填充简单使用fillRect而不是drawRect。它采用与drawRect 相同的参数,因此您所要做的就是更改名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多