在我的 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

我在这个条件语句中找不到逻辑错误。我不完全知道我的逻辑在哪里不正确

学习 PyQt5。在我的代码片段中找不到错误 [关闭]

在我的 SQL 语法中找不到错误 - PHP(请查看语法手册?)

maven 在我的存储库中找不到原型

在我的 math.h 中找不到 log2?