在我的 for 循环中找不到逻辑错误
Posted
技术标签:
【中文标题】在我的 for 循环中找不到逻辑错误【英文标题】:Trouble finding logical error in my for loop 【发布时间】:2014-03-03 21:24:45 【问题描述】:我正在使用 Java 和 GridBagLayout 重新创建图像中看到的表单。为了在星期几下创建网格线,我将带有边框的空 JLabels 插入到空单元格中。这对我来说是完美的,然后我决定让表单上阴影的每个空单元格在 java 中也有阴影,这就是我苦苦挣扎的地方。
我的想法是我可以像使用 x 和 y 坐标一样创建一个“阴影指针”,这个 shadePtr 将以 8 的值开始,因为当循环对一行进行着色时,这是要着色的第一行,然后将 shadePtr 增加 3,因为第 11 行是下一个要着色的行,然后是 14,依此类推。
到目前为止,我获得的唯一一点成功是,如果我注释掉你看到的最后一行代码 (shadePtr = shadePtr + 3),但只有一行被遮蔽。我似乎无法弄清楚我在做什么我在这里做错了,感谢您的时间和精力。
int yPointer = 7;
int xPointer = 3;
int shadePtr = 8;
for (int j = 0; j <= 299; j++)
gbc.gridx = xPointer;
gbc.gridy = yPointer;
gbc.gridheight = 1;
gbc.gridwidth = 1;
if (yPointer == 36) calendarGridLines[j].setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.BLACK)); //if bottom row
else calendarGridLines[j].setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.BLACK));
if (yPointer == shadePtr) //if row number = shadePtr then color the cell
calendarGridLines[j].setOpaque(true);
calendarGridLines[j].setBackground(Color.GRAY);
gridbag.setConstraints(calendarGridLines[j], gbc);
rp.add(calendarGridLines[j]);
xPointer++; //go to next cell in row
j++; //use the next jlabel
gbc.gridx = xPointer;
gbc.gridy = yPointer;
gbc.gridheight = 1;
gbc.gridwidth = 1;
if (yPointer == 36) calendarGridLines[j].setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK)); //if bottom row
else calendarGridLines[j].setBorder(BorderFactory.createMatteBorder(1, 1, 0, 1, Color.BLACK));
if (yPointer == shadePtr) //if row number = shadePtr then color the cell
calendarGridLines[j].setOpaque(true);
calendarGridLines[j].setBackground(Color.GRAY);
gridbag.setConstraints(calendarGridLines[j], gbc);
rp.add(calendarGridLines[j]);
xPointer++; //go to next cell in row
if(xPointer == 13) //if end of column then go to next row and reset column pointer to 3 and increment shade pointer by 3
yPointer++; //go down a row
xPointer = 3;
shadePtr = shadePtr + 3; //when this line is commented out, one row will be colored; when active none are colored
【问题讨论】:
【参考方案1】:到目前为止,我获得的唯一一点成功就是注释掉最后一行 您看到
(shadePtr = shadePtr + 3)
的代码,但只有一行是 阴影。我似乎无法弄清楚我在这里做错了什么 非常感谢您的时间和精力。
如果我理解你的代码是正确的:
yPointer
是网格中的“行”号。
shadePtr
是要着色的下一行的索引。
问题是您在每次迭代中将 yPointer
增加 1 个单位(这很好)但是 shadePtr
在每次迭代中也会增加 3 个单位。由于yPointer
从 7 开始,shadePtr
从 8 开始,因此这些变量永远不会相等,因为 shadePtr
将始终大于 yPointer
。
如果您在第二次迭代yPointer == shadePtr == 8
中注释最后一行,这是第一个阴影行。但稍后yPointer
将增加,shadePtr
仍为 8,因此不再有行被着色。
数字 3 对解决您的问题很重要,但在最后做这个小改动:
int yPointer = 7;
int xPointer = 3;
int shadePtr = 8;
for (int j = 0; j <= 299; j++)
...
if(xPointer == 13) //if end of column then go to next row and reset column pointer to 3 and increment shade pointer by 3
yPointer++; //go down a row
xPointer = 3;
if((j % 3) == 0)
shadePtr = yPointer;
这意味着,如果j
是 3 的倍数,则下一行应加阴影,因此进行此分配:shadePtr = yPointer
增加 yPointer
。这将遮蔽这些行号:8、11、14、17、20、23、26、29、32 和 35。
通过这种方式,你的问题应该通过做一些改变来解决,但注意shadePtr
实际上是不必要的。你可以有一个简单的布尔值来知道该行是否应该被着色:
int yPointer = 7;
int xPointer = 3;
boolean shade = false;
for (int j = 0; j <= 299; j++)
...
if(xPointer == 13) // end of column
yPointer++; //go down a row
xPointer = 3;
shade = (j % 3) == 0;
【讨论】:
感谢@dic19,您的解决方案有效。但是根据我自己的理解,你能回答这个问题/担忧吗?:你说我的 shadePtr 每次迭代都增加了 3,但我认为通过在最后一个 else 语句中将 shadePtr 增加 3,这只是在我结束时该行应该将我的新 shadePtr 设置为 11,这是我希望下一行被着色的位置。我的推理有什么问题? 哦,等一下,我才恍然大悟。我不得不阅读你的解释几次才能理解。再次感谢!精彩的解释。 @solleks 不客气!很高兴能帮助你。这有点难以理解,但认为你明白了:)以上是关于在我的 for 循环中找不到逻辑错误的主要内容,如果未能解决你的问题,请参考以下文章
在我的循环中找不到ArrayIndexOutOfBoundsException:5
我在这个条件语句中找不到逻辑错误。我不完全知道我的逻辑在哪里不正确