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



我的想法是我可以像使用x和y坐标一样创建一个“阴影指针”,该shadePtr将从值8开始,因为这是要填充的第一行,当循环对一行进行阴影处理时,然后因为第11行是下一个要着色的阴影,所以将shadePtr增加3,然后是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
        }
    }

最佳答案

到目前为止,我获得的唯一成功是,如果我在最后一行注释掉
  您看到(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;
    }
}

10-07 22:55