我刚刚遇到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);
}
}
}
答案 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次。你忘记了零。或者你的意见是错误的。