使用 GridLayout 更改 JPanel 中的组件

Changing the components inside a JPanel with GridLayout

这是下面的代码。

import javax.swing.*;

import java.awt.Color;
import java.awt.GridLayout;
import java.util.ArrayList;

public class Grid extends JPanel {

    private static final long serialVersionUID = 1L;

    private ArrayList<Cell> cells;
    private int width = 20;
    private int height = 20;

    public Grid() {
        cells = new ArrayList<Cell>();
    }

    public void drawGrid() {
        this.setLayout(new GridLayout(width, height, 5, 5));
        this.setBackground(Color.RED);

        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                Cell cell = new Cell(i, j);
                cells.add(cell);
            }
        }
        for (Cell c : cells) {
            this.add(c);
        }

    }

    public ArrayList<Cell> getCells() {
        return cells;
    }

    public void setCells(ArrayList<Cell> cells) {
        this.cells = cells;
    }

    public void changeCell(Cell c) {
        for (Cell cell : cells) {
            if (cell.getx() == c.getx() && cell.gety() == c.gety()) {
                cell = c;

                /*
                System.out.println(c.getx() + " " + c.gety()
                                    + c.getBackground().toString());
                                    */

            }
        }
    }

此代码中的问题出现在 changeCell(Cell c) 中,我想在其中将这个新单元格添加到 JPanel 单元格中。目前,在网格中添加单元格的代码行是增强的 for 循环,位于 for each 循环下方以绘制网格 (this.add(c))。

我无法 add/update 将在 changeCell(Cell c) 方法中找到的参数传递给当前 JPannel 中找到的单元格。我需要做的就是更新 ArrayList,以便 JPanel 上的单元格对应于在 ArrayList 中找到的单元格。

您正在更改模型 (ArrayList<Cell>),但未对其视图(您的网格 JPanel)进行任何更改。 尝试这样的事情:

public void changeCell(Cell c) {
    this.removeAll(); //erase everything from your JPanel
    this.revalidate; this.repaint();//I always do these steps after I modify my JPanel
    for (Cell cell : cells) {
        if (cell.getx() == c.getx() && cell.gety() == c.gety()) {
              this.add(c);
        else this.add(cell);
    }
}

简而言之,从您的面板中删除所有内容并再次添加您的单元格,但是当您发现要更改的单元格时,添加那个而不是另一个。

或者,更好的是,您应该使用 Model-View-Controller pattern,其中您的模型是您的 ArrayList,您的视图是您的 Grid JPanel,您的控制器是 JApplet\JFrame 或其他创建视图和型号。

告诉我。再见!