For循环不起作用

时间:2014-10-19 03:02:16

标签: java for-loop

我已经看过很多for循环的例子,我无法弄清楚为什么我的工作不起作用。在我的程序中有一个组件,查看器和一个构建类。我设置了它,所以当你在组件中创建一个新的建筑时,你输入x-pos,y-pos和#of levels。我想运行for循环来创建每个级别,但它不起作用。请帮助和谢谢。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;


public class Building
{
    /**number of levels the building has*/
    private int levels;
    private int xLeft;
    private int yTop;
    private int lvls;

    /**
     * Constructor for objects of class Building
     * 
     * @param x x-Coordinate
     * 
     * @param y y-Coordinate
     * 
     * @param levels The number of thevels the building will have
     */
    public Building(int x, int y, int lvls)
    {
        xLeft = x;
        yTop = y;
        levels = lvls;

    }

    /**
     * Draws the building
     * 
     * @param  g2   graphics contex
     */
    public void draw(Graphics2D g2)
    {
      /**creates one building level*/
      Rectangle body = new Rectangle(xLeft/*X*/, yTop/*Y*/, 100/*Width*/,         100/*Height*/);
      /**creates window inside of building level*/
      Rectangle window = new Rectangle(xLeft+25, yTop+25, 50, 50);
      g2.setColor(Color.DARK_GRAY);
      g2.fill(body);
      g2.setColor(Color.ORANGE);
      g2.fill(window); 

      /**Creates (levels) number of levels*/
      for(int i = 1; i<=levels; i++)
      {
         /**Adds 100 to y value of body*/
         body.setLocation(xLeft, yTop-100);
         g2.setColor(Color.DARK_GRAY);
         g2.fill(body);
         window.setLocation(xLeft+25, yTop-75);
         g2.setColor(Color.ORANGE);
         g2.fill(window);   
        }


    }

}

1 个答案:

答案 0 :(得分:2)

每次循环运行时,你需要在for循环中使用i的值乘以你从yTop减去的值。现在,您总是从100中减去yTop,如下所示:

body.setLocation(xLeft, yTop-100);

问题在于,每次循环运行时,您都要将位置设置为xLeft的值和yTop - 100的值,这意味着您基本上将所有级别放在顶部彼此。幸运的是,我们有i的值,每次循环运行时增加1。因此,我们可以将100乘以yTop乘以i,如下所示:

body.setLocation(xLeft, yTop-(100*i));

现在,在循环的第一次运行中,i将为1100*1100,因此100将从yTop中减去i。在循环的第二次运行中,2将增加到100*2200200,因此yTop将从window.setLocation(xLeft+25, yTop-75); 中减去window.setLocation(xLeft+25, yTop-(75*i)); 。看看我要去哪里?

对于Windows来说,这是一个类似的想法。现在,您将所有窗口重叠在一起。如果你改变:

window.setLocation(xLeft+25, yTop-(100*i)+25);

为:

{{1}}

窗户将不再重叠。

然而,窗口放置代码带来了一个新问题。因为等级的高度增加了100,而窗户的高度只增加了75,所以最终你将拥有一次重叠两个等级的窗口。运行程序时,您将看到我的意思。 (在没有窗户的建筑物顶部会有很大的间隙)要解决这个问题,你需要先将窗户高度增加到与水平面相同的高度,然后将窗口偏移25,将其置于水平的中心。

这应该对你更好:

{{1}}

我希望这有帮助!