为什么我的变量没有在这些语句中加在一起?

时间:2010-02-22 04:30:01

标签: java

我正在开发一些Java逻辑,但我不确定为什么这不起作用。这是我制作的方法:

private void printSubclassBoxes(){
        int  coordinateX = ((getWidth() - BOX_WIDTH) /4);

        for ( int i = 0; i < 3; i++){

            double coordinateY = (getHeight() / 2);     
            GRect classBox = new GRect (coordinateX, coordinateY, BOX_WIDTH, BOX_HEIGHT);

            GLabel classLabel = new GLabel ("Program");
            double labelCoordinateX = (coordinateX + ((classBox.getWidth() / 2) - (classLabel.getWidth() / 2)));
            double labelCoordinateY = (coordinateY + ((classBox.getHeight() / 2) + (classLabel.getAscent() / 2)));
            add(classBox);
            add(classLabel, labelCoordinateX, labelCoordinateY);
            if (i == 1){
            coordinateX = (((getWidth() - BOX_WIDTH) /4) * 2);
        } 
        if (i == 2){
            coordinateX = (((getWidth() - BOX_WIDTH) /4) * 3);
        } 

        }   

    }

现在我确定可能有更好的方法来做到这一点,但是请 - 我现在对此不感兴趣(我正在努力学习而不是用勺子做出答案)。所有我想知道的是为什么结尾的两个if语句不能像我认为的那样工作。

为简单起见,我们说

100 = ((getWidth() - BOX_WIDTH)

int coordinateX = 25;

我的理解是int i到达第一个if语句并添加25 + 25,然后coordinateX = 50。

然后下一次在循环中,i = 2,所以coordinateX将= 75.

这是我期待发生的事情,但事实并非如此。我似乎是直接在前面打印两个盒子,然后第三个是移动25个。

感谢您的帮助。现在我已经找到了那个循环,我继续以不同的方式解决它。我最终将coordinateX分配给另一个变量并使用它添加到结尾:

int  coordinateX = ((getWidth() - BOX_WIDTH) /4);
        int otherCoordinateX = coordinateX;

        for ( int i = 0; i < 3; i++){

            double coordinateY = (getHeight() / 2);     
            GRect classBox = new GRect (coordinateX, coordinateY, BOX_WIDTH, BOX_HEIGHT);

            GLabel classLabel = new GLabel ("Program");
            double labelCoordinateX = (coordinateX + ((classBox.getWidth() / 2) - (classLabel.getWidth() / 2)));
            double labelCoordinateY = (coordinateY + ((classBox.getHeight() / 2) + (classLabel.getAscent() / 2)));
            add(classBox);
            add(classLabel, labelCoordinateX, labelCoordinateY);
            coordinateX = otherCoordinateX + coordinateX;

        }   

4 个答案:

答案 0 :(得分:1)

在循环的第一次迭代中:

  • i = 0
  • coordinateX = 25,正如所料。

在迭代结束时,coordinateX 更新(自i == 0起)。

然后,在第二次迭代:

  • i = 1
  • 但仍然coordinateX = 25,因为它没有更新。

在第二次迭代结束时,coordinateX 因<{1}}测试而更新。

第三次迭代中

  • if i == 1)
  • 使用了i = 2的新值,该值是在第二次迭代结束时设置的。

<强>解决方案

要不以任何重要方式更改您的代码,只需将coordinateX替换为if (i == 1),将if (i == 0)替换为if (i == 2)

编辑:课程

if (i == 1)中,每次迭代的开始检查for(...) { } declaration测试,但端调用i < 3部分每次迭代。

答案 1 :(得分:1)

你只有一个一个一个循环索引问题。第一次通过您的循环时,i0,而不是1。第二次,它是1,而不是2。分别将行if (i == 1)if (i == 2)更改为if (i == 0)if (i == 1)可以解决您的问题。

然而,这仍然是一种奇怪的循环方式。更标准的方法是设置一个incrementX变量,然后在每次循环时无条件地添加它。

答案 2 :(得分:1)

由于你想在“下一次迭代”之前增加值,你应该在第一个/第二个和第二个/第三个之间进行增加,但是你将变量coordinateX的更新放在循环的末尾,所以你应该检查不同的索引:01

这是什么意思?

这有效:

for ( int i = 0; i < 3; i++)
{
  /* other part of the loop */  
  if (i == 0)
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 2);
  else if (i == 1)
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 3);
}  

但这也有效:

for ( int i = 0; i < 3; i++)
{
  if (i == 1)
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 2);
  else if (i == 2)
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 3);
  /* other part of the loop */  
}  

答案 3 :(得分:0)

看起来似乎是一个蹩脚的答案,但这就是我在这些情况下所做的。放入一堆打印语句,当它循环时你可以验证你得到的输出是你期望的。如果它不在某一点,请开始尝试确定原因。