我正在用Java创建生活游戏,需要在屏幕上随机绘制单元格,因此我扩展了JComponent类以绘制矩形,然后将JComponent添加到我的JFrame中。我以前曾尝试将矩形直接绘制到JFrame上,但后来发现这不是应该做的事情,因此现在我创建了一个嵌套的私有类,并在其上绘制了矩形并将其添加到我的JFrame中。一切都正确编译,但是我的JFrame上没有任何显示。我的代码如下:
import javax.swing.JFrame;
import java.util.Random;
import java.util.Arrays;
import javax.swing.JComponent;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Color;
public class GameOfLife extends JFrame {
int PIXELSIZE = 10;
int ROW = 700;
int COLUMN = 700;
Random random = new Random();
int grid[][] = new int[ROW][COLUMN];
int updatedGrid[][] = new int[ROW][COLUMN];
public GameOfLife() {
this.setTitle("Game Of Life: Java");
this.setSize(ROW, COLUMN);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(new DrawCells());
this.setVisible(true);
}
public int[][] createGrid() {
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
grid[i][j] = random.nextInt(2);
}
}
//System.out.println(Arrays.deepToString(grid).replace("], ", "]\n"));
return grid;
}
private class DrawCells extends JComponent {
int x;
int y;
public void paintComponent(Graphics g) {
x = random.nextInt();
y = random.nextInt();
Graphics2D g2 = (Graphics2D) g;
for (int i = 0; i < ROW - 1; i++) {
for (int j = 0; j < COLUMN - 1; j++) {
if (grid[ROW][COLUMN] == 1) {
super.paintComponent(g);
g2.setColor(Color.BLUE);
g2.drawRect(x, y, 10, 10);
}
}
}
}
}
public static void main(String[] args) {
GameOfLife gol = new GameOfLife();
}
}
编辑:我收到了java.lang.ArrayIndexOutOfBoundsException:
非常感谢您提供任何有关如何正确绘制矩形的帮助或信息,谢谢。
代码有几个问题:
super.paintComponent(g);
调用super.paintComponent()
的目的是调用组件的默认绘画代码。它只能在方法顶部被调用一次。如果不应在循环代码内调用。
if (grid[ROW][COLUMN] == 1) {
上面的语句不执行任何操作(实际上它会导致异常),因为您始终检查数组中的相同值。
您真正想要的是使用“ i”和“ j”索引的值来查看应该绘制哪些矩形。
for (int i = 0; i < ROW - 1; i++) {
for (int j = 0; j < COLUMN - 1; j++) {
不需要“-1”。您要检查数组中的每个值。
x = random.nextInt();
y = random.nextInt();
不要在绘画方法中使用随机逻辑。绘制方法仅应绘制组件的当前状态。它不应更改状态。
int PIXELSIZE = 10;
int ROW = 700;
int COLUMN = 700;
这些数字没有意义。如果一行中有700个对象,而每个对象为10像素,那么您需要的屏幕尺寸为7,000像素。
也许使用类似的东西:
int PIXELSIZE = 2;
int ROW = 500;
int COLUMN = 300;
现在,当您进行绘画时,您将具有类似以下内容的代码:
//g2.drawRect(x, y, 10, 10);
g2.fillRect(j * PIXELSIZE, i * PIXELSIZE, PIXELSIZE, PIXELSIZE);
因此,数组中的每个条目将在屏幕上绘制为两个像素。
而且,您从未调用过createGrid()
方法,因此数组中的值也不会被设置。
但是,最大的问题是数组应该是DrawCells
类的一部分。数据应存储在类中,以便绘画方法可以使用该数据。