我正在尝试使用我的fillCell方法,以便能够根据参数中输入的颜色更改颜色,但是我不知道如何利用图形来更改颜色并重新绘制它,我没有为此导入ObjectDraw。我正在尝试为我正在尝试创建的贪吃蛇游戏执行此操作。该课程旨在绘制网格,为蛇的身体和头部着色,以及清除蛇的末端并为障碍物着色。到目前为止,我有:
import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;
import java.awt.event.*;
public class GraphicsGrid extends JPanel
{
private ArrayList<Point> fillCells;
private int wid, hei, pix;
/**
* Creates an arraylist and sets the default width, height and pixel
* for a grid.
*/
public GraphicsGrid() {
fillCells = new ArrayList<Point>();
wid = 400;
hei = 400;
pix = 10;
}
/**
* Creates an arraylist and sets the inputted width, height and pixel
* for a grid.
* @param width size of the width for the grid
* @param height size of the height for the grid
* @param pixel size for each cell
*/
public GraphicsGrid(int width, int height, int pixel) {
fillCells = new ArrayList<Point>();
wid = width;
hei = height;
pix = pixel;
}
/**
* fills and paints the current cell and creates the grid with lines
* @param g creates an instance of graphics that has been imported
*/
@Override
protected synchronized void paintComponent(Graphics g) {
super.paintComponent(g);
for (Point fillCell : fillCells) {
int cellX = (fillCell.x * pix);
int cellY = (fillCell.y * pix);
g.setColor(Color.GREEN);
g.fillRect(cellX, cellY, pix, pix);
}
g.setColor(Color.BLACK);
g.drawRect(0, 0, wid*pix, hei*pix);
for (int i = 0; i < wid*pix; i += pix) {
g.drawLine(i, 0, i, hei*pix);
}
for (int i = 0; i < hei*pix; i += pix) {
g.drawLine(0, i, wid*pix, i);
}
}
/* *
* adds a point to the cell and repaints the cell
* @param x x-coordinate of the cell
* @param y y-coordinate of the cell
*/
public void fillCell(int x, int y, Color block) {
Graphics g = new Graphics();
super.paintComponent(g);
fillCells.add(new Point(x, y));
if(block.equals("black"))
{
g.setColor(Color.BLACK);
repaint();
}
else if(block.equals("red"))
{
g.setColor(Color.RED);
repaint();
}
else if(block.equals("white"))
{
g.setColor(Color.WHITE);
repaint();
}
else
{
g.setColor(Color.Green);
repaint();
}
repaint();
}
我也无法为此程序创建另一个类文件。
Graphics g = new Graphics();
图形是一个抽象类,所以这永远不会起作用。
建议:
- 创建一个 Cell 类,为其指定一个点和一个颜色字段以及它需要的任何其他字段,并为其提供所需的任何 getter/setter/constructor。
- 给 Cell 一个
draw(Graphics g)
方法,允许它使用自己的点的 x 和 y 以及颜色字段绘制自己。 - 给你的班级一个以上
ArrayList<Cell>
,并根据需要填写。 - 在
paintComponent
方法重写中,循环访问上面的 ArrayList,对 ArrayList 中的每个 Cell 调用draw(g)
。 - 我不确定你为什么要把你的
paintComponent
方法synchronized
但对我来说这看起来有点粗略,我建议你去掉这个关键词。 - 仅在
paintComponent
重写方法中调用super.paintComponent(g)
方法。 - 你看过图形教程吗?如果没有,我建议你尽快这样做。您可以在此链接中找到它们。