Java 为什么我只需要循环23次就可以画出24个矩形?

Java 为什么我只需要循环23次就可以画出24个矩形?,java,multidimensional-array,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;

我刚刚遇到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++) 
for(int r=0;r
然后我决定不画最后一行,并这样做:

r < grid.length - 1; 
r
什么也没发生。我想也许我需要括号。我添加了它们,但仍然不起作用。 然后我把它改成了

r < grid.length - 2;
r
在这种情况下,最后一排并没有像我最初想要的那样被粉刷

但现在我很困惑,因为数学上:grid.length-2=22;r<22意味着r(max)=21,这意味着我应该有两行没有画。我错过了什么

测试用例:
类操作扩展了JPanel{
公共静态最终整数帧大小=370;
公共静态最终整数帧大小Y=720;
私有整数[][]网格=新整数[24][12];
public Action(){//为JPanel设置所有内容
维度操作维度=新维度(360690);
setPreferredSize(actionDimension);
setVisible(真);
//...
}
@凌驾
受保护的组件(图形笔){
超级油漆组件(pen);
for(int r=0;r
用于(int r=0;r

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

拿出一张纸,在上面画一个漂亮的大矩形。这是你的JPanel。在本例中,我们将网格长度转换为3

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

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

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

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


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

时间已晚,而且我对JPanel一无所知,但是

公共静态最终整数帧大小=370;
公共静态最终整数帧大小Y=720;

Dimension actionDimension=新维度(360690);
非常确定您的面板比您的帧短一行(30个单位),因此即使您循环24次并渲染24行,最后一行也会被剪裁,因为屏幕上只有23行的空间


将面板扩展到720(或更高)的高度,我敢打赌您会注意到23行和24行之间的差异…

肯定还有其他东西。这应该按预期工作。您不希望使用
网格[r].length
而不是
网格[c].length
?您应该使用
网格[r].length绘制网格而不是c我想..不,在这种情况下我不画列。我说的是争吵,那是。每行的列数完全相同,
grid[r]
的长度与
grid[c]
的长度相同。这是一个多么好的例子!如果我有一个一维数组,这将是一个很好的解释。但我有一个2D数组。继续你的例子。。。在那幅画上画两条垂直线。您将在每个矩形内得到3个正方形。如果我不画最后一行,将矩形分割成正方形的垂直线就不会被画出来。不过,我很感谢你的回答。我知道你不必这么做,但是如果你在主持人编辑之前查看一下问题的版本,你将能够找到包含更多细节和编译的代码,您将能够观察到与我完全相同的事情。另一个支持将代码列表提取到尽可能小的示例的论点是,这样可以更容易地看到bug…;-)
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);
       }
   }
}
for (int r = 0; r < grid.length; r++ )
public static final int FRAME_SIZE_X = 370;
public static final int FRAME_SIZE_Y = 720;
Dimension actionDimension = new Dimension(360, 690);