无法使 Jgrid 中的 JPanels 立即对更改做出反应
Having trouble making the JPanels inside Jgrid react to change immediately
我目前正在尝试使用 Swing 在 java 中编写 John Conway 的人生游戏。然而,我 运行 遇到了关于 GridLayout
中 JPanel
个单元格的问题。这是有问题的代码
GameOfLifeFrame(int size, int generations, Random random, boolean[][] grid, final GameOfLife life) {
super("Game of life");
this.size = size;
this.generations = generations;
this.random = random;
this.grid = grid;
this.life = life;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
var contentPane = getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
JLabel generationMaker = new JLabel("Generation: ");
add(generationMaker);
JLabel alive = new JLabel("Alive: 0");
add(alive);
var gridPanel = new JPanel();
gridPanel.setLayout(new GridLayout(size, size, 0, 0));
contentPane.add(gridPanel);
var cellArray = new javax.swing.JPanel[size][size];
for (var i = 0; i < size; i++) {
for (var j = 0; j < size; j++) {
var cell = new JPanel();
cellArray[i][j] = cell;
cell.setBorder(BorderFactory.createLineBorder(Color.BLACK));
gridPanel.add(cell);
}
}
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
var button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
generateGrid(cellArray);
alive.setText("Alive: " + countAlive(life.grid));
incrementGeneration();
generationMaker.setText("Generation #" + generationCounter);
}
});
contentPane.add(button);
setVisible(true);
}
private void generateGrid(JPanel[][] cellArray) {
var grid2 = getGrid();
fillInPanels(cellArray, grid2);
life.grid = grid2;
}
protected void fillInPanels(javax.swing.JPanel[][] panelArray, boolean[][] grid) {
for (var i = 0; i < size; i++) {
for (var j = 0; j < size; j++) {
if (grid[i][j]) {
panelArray[i][j].setBackground(Color.BLACK);
} else {
panelArray[i][j].setBackground(Color.WHITE);
}
}
}
}
它工作正常,是康威生命游戏的一个很好的模拟器,但它有一个奇怪的效果,整个屏幕不会立即改变,但你可以看到单个单元格在改变,而不是正确改变离开,就在我按下按钮的时候。这是因为双缓冲吗?当屏幕上存活的细胞较少时,效果会更好,也就是当它真正开始快速移动时。
Here is how it is like on a 35 by 35 size grid
问题的根源是什么,我该如何解决?如果问题或 post 的格式不正确,请原谅我,这是我第一次 post 来这里。
问题的原因是每次我更改图块的油漆颜色(从黑色到白色或从黑色到白色)时都会重新绘制网格。在执行 fillInPanels
时将 setVisible
设置为 false,然后将其设置回 true 解决了问题。
我目前正在尝试使用 Swing 在 java 中编写 John Conway 的人生游戏。然而,我 运行 遇到了关于 GridLayout
中 JPanel
个单元格的问题。这是有问题的代码
GameOfLifeFrame(int size, int generations, Random random, boolean[][] grid, final GameOfLife life) {
super("Game of life");
this.size = size;
this.generations = generations;
this.random = random;
this.grid = grid;
this.life = life;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
var contentPane = getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
JLabel generationMaker = new JLabel("Generation: ");
add(generationMaker);
JLabel alive = new JLabel("Alive: 0");
add(alive);
var gridPanel = new JPanel();
gridPanel.setLayout(new GridLayout(size, size, 0, 0));
contentPane.add(gridPanel);
var cellArray = new javax.swing.JPanel[size][size];
for (var i = 0; i < size; i++) {
for (var j = 0; j < size; j++) {
var cell = new JPanel();
cellArray[i][j] = cell;
cell.setBorder(BorderFactory.createLineBorder(Color.BLACK));
gridPanel.add(cell);
}
}
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
var button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
generateGrid(cellArray);
alive.setText("Alive: " + countAlive(life.grid));
incrementGeneration();
generationMaker.setText("Generation #" + generationCounter);
}
});
contentPane.add(button);
setVisible(true);
}
private void generateGrid(JPanel[][] cellArray) {
var grid2 = getGrid();
fillInPanels(cellArray, grid2);
life.grid = grid2;
}
protected void fillInPanels(javax.swing.JPanel[][] panelArray, boolean[][] grid) {
for (var i = 0; i < size; i++) {
for (var j = 0; j < size; j++) {
if (grid[i][j]) {
panelArray[i][j].setBackground(Color.BLACK);
} else {
panelArray[i][j].setBackground(Color.WHITE);
}
}
}
}
它工作正常,是康威生命游戏的一个很好的模拟器,但它有一个奇怪的效果,整个屏幕不会立即改变,但你可以看到单个单元格在改变,而不是正确改变离开,就在我按下按钮的时候。这是因为双缓冲吗?当屏幕上存活的细胞较少时,效果会更好,也就是当它真正开始快速移动时。
Here is how it is like on a 35 by 35 size grid
问题的根源是什么,我该如何解决?如果问题或 post 的格式不正确,请原谅我,这是我第一次 post 来这里。
问题的原因是每次我更改图块的油漆颜色(从黑色到白色或从黑色到白色)时都会重新绘制网格。在执行 fillInPanels
时将 setVisible
设置为 false,然后将其设置回 true 解决了问题。