В настоящее время я пытаюсь написать игру жизни Джона Конвея в java, используя Swing. Однако у меня возникли проблемы с ячейками JPanel
в GridLayout
. Вот код, который вызывает проблемы: c
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);
}
}
}
}
Он отлично работает и является отличным эмулятором жизненной игры Конвея, но имеет странный эффект, когда весь экран не меняется сразу , но вы можете видеть, как отдельные ячейки меняются, а не меняются сразу, когда я нажимаю кнопку. Это из-за двойной буферизации? Он работает лучше, когда на экране меньше живых ячеек, и именно тогда он действительно начинает работать быстро.
Вот как это похоже на сетку размером 35 на 35
В чем причина проблемы и как ее решить? Пожалуйста, простите меня, если у меня плохое форматирование вопроса или сообщения, я публикую здесь впервые.