如何向JComponent添加多个矩形?

问题描述 投票:0回答:1

我正在用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:

的运行时错误

非常感谢您提供任何有关如何正确绘制矩形的帮助或信息,谢谢。

java swing graphics drawing jcomponent
1个回答
0
投票

代码有几个问题:

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类的一部分。数据应存储在类中,以便绘画方法可以使用该数据。

© www.soinside.com 2019 - 2024. All rights reserved.