我正在使用Java和GridBagLayout来重新创建图像中看到的表单。为了在一周的几天内创建网格线,我将带有边框的空JLabel插入到空单元格中。这对我来说很完美,然后我决定让每个在窗体上着色的空单元格也在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
}
}
答案 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;
}
}