如何向 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应该是DrawCells
class的一部分。数据应存储在 class 中,以便绘画方法可以使用该数据。
我正在 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应该是DrawCells
class的一部分。数据应存储在 class 中,以便绘画方法可以使用该数据。