无法使 Jgrid 中的 JPanels 立即对更改做出反应

Having trouble making the JPanels inside Jgrid react to change immediately

我目前正在尝试使用 Swing 在 java 中编写 John Conway 的人生游戏。然而,我 运行 遇到了关于 GridLayoutJPanel 个单元格的问题。这是有问题的代码

    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 解决了问题。