【问题标题】:Why do I only need to loop 23 times to draw 24 rectangles?为什么我只需要循环 23 次就可以画出 24 个矩形?
【发布时间】:2013-12-29 18:54:14
【问题描述】:

我刚刚遇到了 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

测试用例:

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);
       }
   }
}

【问题讨论】:

  • 肯定还有别的。这应该可以按预期工作。
  • 你不想用grid[r].length 代替grid[c].length吗?
  • 你应该用grid[r].length;而不是我认为的c来绘制你的网格..
  • 不,在这种情况下,我不绘制列。我说的是行。
  • 那个shouldn't make a difference。每行的列数完全相同,grid[r] 的长度与grid[c] 的长度相同。

标签: java multidimensional-array


【解决方案1】:

已经很晚了,无论如何我对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 行之间的区别...

【讨论】:

  • 另一个支持将代码清单提炼成尽可能小的示例的理由是,它可以更容易地查看错误... ;-)
【解决方案2】:

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

拿出不同颜色的笔,画出你的第一个矩形。这应该从左上角到右上角,在 JPanel 的三分之一处向下,再穿过,然后回到左上角。

现在绘制第二个矩形。我们将从 JPanel 的三分之一处开始向下,穿过右侧,再向下走三分之一,返回穿过,然后回到我们开始的位置。

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

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

请注意,如果您在绘制 JPanel 和绘制行之间更改笔颜色,则更容易发现问题。

【讨论】:

  • 多么好的例子!
  • 如果我有一个一维数组,那将是一个很好的解释。但我有一个二维数组。继续你的例子......在那张照片上画两条垂直线。您将在每个矩形内获得 3 个正方形。如果我不画最后一行 - 将矩形分成正方形的垂直线根本不会被绘制。不过,我很感激你的回答。
【解决方案3】:
for (int r = 0; r < grid.length; r++ )

如果 grid.length 为 24,则迭代 24 次。你忘记了零。否则你的观察是错误的。

【讨论】:

  • 我知道您不必这样做,但是如果您在版主编辑之前查看问题的版本,您将能够找到包含更多细节和编译后,您将能够观察到与我所做的完全相同的事情。
猜你喜欢
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2018-06-06
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多