使用 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 或其他创建视图和型号。
告诉我。再见!
这是下面的代码。
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 或其他创建视图和型号。
告诉我。再见!