我正在开发一些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;
}
答案 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)
你只有一个一个一个循环索引问题。第一次通过您的循环时,i
为0
,而不是1
。第二次,它是1
,而不是2
。分别将行if (i == 1)
和if (i == 2)
更改为if (i == 0)
和if (i == 1)
可以解决您的问题。
然而,这仍然是一种奇怪的循环方式。更标准的方法是设置一个incrementX
变量,然后在每次循环时无条件地添加它。
答案 2 :(得分:1)
由于你想在“下一次迭代”之前增加值,你应该在第一个/第二个和第二个/第三个之间进行增加,但是你将变量coordinateX
的更新放在循环的末尾,所以你应该检查不同的索引:0
和1
。
这是什么意思?
这有效:
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)
看起来似乎是一个蹩脚的答案,但这就是我在这些情况下所做的。放入一堆打印语句,当它循环时你可以验证你得到的输出是你期望的。如果它不在某一点,请开始尝试确定原因。