我正在使用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;
}
}