如何向 JComponent 添加多个矩形?

how can I add multiple rectangles to JComponent?

我正在 java 中创建生命游戏,需要在屏幕上随机绘制单元格,因此我扩展了 JComponent class 以绘制矩形,然后我想添加JComponent 到我的 JFrame。我之前尝试将矩形直接绘制到 JFrame 上,但后来发现这不是应该做的事情所以现在我创建了一个嵌套的私有 class 并在其上绘制了矩形并将其添加到我的J框架。一切都在正确编译,但我的 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 不应在循环代码中调用。

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() 方法,因此永远不会设置数组中的值。

不过,最大的问题是Array应该是DrawCellsclass的一部分。数据应存储在 class 中,以便绘画方法可以使用该数据。