2014-02-06 69 views
1

我正在使用Java和GridBagLayout重新创建图像中显示的窗体。为了在一周内创建网格线,我将带有边框的空JLabel插入到空单元格中。这对我来说非常合适,然后我决定让每个在表单上加阴影的空单元格都用java着色,这就是我挣扎的地方。在我for循环中发现逻辑错误

labor record

我的想法是,我可以创造一个“绿荫指针”像我和我的X和Y坐标一样,这shadePtr将与8值开始,因为这是第一个行进行shadded,当循环遮住一行时,它会将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 
     } 
    } 

回答

2

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

感谢@ dic19,您的解决方案工作。但是为了我自己的理解,你能回答这个问题吗?你说我的shadePtr每迭代增加3次,但是我认为通过在最后一个else语句中增加shadePtr 3,只有当我到达结尾时该行应该将我的新shadePtr设置为11,这是我希望下一行被遮挡的位置。我的推理出了什么问题? –

+0

哦等一下,它刚刚在我身上发现。我必须仔细阅读你的解释才能沉入其中。再次感谢!精彩的解释。 –

+0

@solleks欢迎您!很高兴帮助你。理解这有点棘手,但认为你得到它:) – dic19