为什么我只需要循环23次来绘制24个矩形?

时间:2013-12-29 18:54:15

标签: java multidimensional-array

我刚刚遇到for循环的奇怪行为,无法找到解释。

我有一个2D游戏,这个逻辑元素是一个领域。

//Declaration of the JPanel logical size. 
private int[][] grid = new int[24][12]; 

行数是24,对吧?

我正在使用这个绘制这个网格:

   for (int r = 0; r < grid.length; r++ ) 
        for (int c = 0; c < grid[r].length; c++) 

然后我决定不画最后一行并做到这一点:

r < grid.length - 1; 
什么也没发生。我想也许我需要括号。我添加了它们仍然无法正常工作。 然后我把它改成了

r < grid.length - 2;

在这种情况下,最后一行没有按照我原来想要的那样绘制。

但现在我很困惑因为数学:grid.length - 2 = 22; r&lt; 22表示r(max)== 21,这意味着我应该有两行未绘制。我错过了什么?

测试用例:

class Action extends JPanel {
   public static final int FRAME_SIZE_X = 370;
   public static final int FRAME_SIZE_Y = 720;
   private int[][] grid = new int[24][12];

  public Action() { //Setting everything for JPanel
     Dimension actionDimension = new Dimension(360, 690); 
     setPreferredSize(actionDimension); 
     setVisible(true); 
     //...
  }

   @Override
   protected void paintComponent(Graphics pen) {
     super.paintComponent(pen);
     for (int r = 0; r < grid.length - 2; r++) //Line with a problem
       for (int c = 0; c < grid[r].length; c++) {

         // [set up pen, etc.]

         // draw line
         pen.drawRect(c * 30, r * 30, FRAME_SIZE_X / 12, FRAME_SIZE_Y / 24);
       }
   }
}

3 个答案:

答案 0 :(得分:10)

现在已经很晚了,我对JPanel一无所知,但是......

public static final int FRAME_SIZE_X = 370;
public static final int FRAME_SIZE_Y = 720;

...

Dimension actionDimension = new Dimension(360, 690); 

非常确定你的面板比你的框架短一行(30个单位) - 所以即使你循环24次并渲染24行,最后一个也会被剪裁,因为屏幕上只有23行的空间。

将面板展开到720(或更高)的高度,我敢打赌你会发现23到24行之间的差异...

答案 1 :(得分:9)

取出一张纸,在上面画一个漂亮的大矩形。这是你的JPanel。为了这个例子,我们将把网格长度变成3。

取出不同颜色的笔,绘制第一个矩形。这应该从左上角到右上角,沿着JPanel的三分之一,回到左上角,然后回到左上角。

现在绘制第二个矩形。我们将启动JPanel的三分之一,向右移动,再向下移动三分之一,然后返回到我们开始的地方。

现在是第三个。但你会注意到你实际上并不需要绘制它。为什么? JPanel已经绘制了两边和底部,顶部与前一行的底部是同一条线。

所以虽然是的,但Swing绘制了另一个矩形,你只是看不到它,因为它绘制的每一条线都已被其他东西绘制。同样,要删除最后一行,您需要停止绘制最后两行。 (你会在你的纸上注意到,只有画了一个矩形才会得到两行。)

请注意,如果您在绘制JPanel和行之间更改笔颜色,则可以更轻松地查看问题。

答案 2 :(得分:0)

for (int r = 0; r < grid.length; r++ )

如果grid.length为24,则迭代24次。你忘记了零。或者你的意见是错误的。