Возникли проблемы с немедленной реакцией JPanels внутри Jgrid на изменение - PullRequest
1 голос
/ 01 августа 2020

В настоящее время я пытаюсь написать игру жизни Джона Конвея в 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

В чем причина проблемы и как ее решить? Пожалуйста, простите меня, если у меня плохое форматирование вопроса или сообщения, я публикую здесь впервые.

1 Ответ

0 голосов
/ 01 августа 2020

Причина проблемы заключалась в том, что сетка перерисовывалась каждый раз, когда я менял цвет краски плитки с черного на белый или наоборот. Установка setVisible на false во время выполнения fillInPanels и последующая установка значения true решила проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...