在for循环中找不到逻辑错误

时间:2014-02-06 18:40:45

标签: java swing for-loop logic gridbaglayout

我正在使用Java和GridBagLayout来重新创建图像中看到的表单。为了在一周的几天内创建网格线,我将带有边框的空JLabel插入到空单元格中。这对我来说很完美,然后我决定让每个在窗体上着色的空单元格也在java中加阴影,这就是我在努力的地方。

labor record

我的想法是我可以创建一个“阴影指针”,就像我用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 个答案:

答案 0 :(得分:2)

  

到目前为止,我获得的唯一成功是如果我注释掉最后一行   您看到的代码(shadePtr = shadePtr + 3),但只有一行   阴暗的。我似乎无法弄清楚我在这里做错了什么   我很感激你的时间和精力。

如果我理解你的代码是正确的,那就是:

  • yPointer是网格中的“行”号。
  • shadePtr是要着色的下一行的索引。

问题是你在每次迭代中以1个单位增加yPointer(很好) 但是 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;
    }
}