перестает перерисовываться JFrame

Изучаю swing и появилась такая проблема, никак не могу найти решение или понять где ошибка, похоже что-то элементарное, но не доходит ( При запуске программы все отлично работает и окно перерисовывается (метод play в main.java). При нажатии на кнопку паузы - цикл прекращается и все останавливается. При нажатии на кнопку паузы еще раз продолжения не происходит - окно не перерисовывается, но сама программа продолжает работать (это проверял выводом в консоль). То есть при повторном запуске метода play - не работает перерисовка - gol.repaint(); - получается что вот это перестает работать или перерисовывает что- то не то. Пробовал и update и paint и убирать этот метод в gameoflife.java - где то я что то упускаю. Подскажите плиз, кому не лень. Заранее спасибо! https://github.com/Kubik13/GameOfLife

Main.java

package life;

import java.util.Random;

public class Main {
    private static Universe universe;
    private static GameOfLife gol;
    private static boolean pause = false;
    private static int N;

    public static void setPause(boolean pause) {
        Main.pause = pause;
    }

    public static void main(String[] args) throws InterruptedException {
        int N = 50; // размер universe
        long seed = (new Random()).nextInt(100000);

        universe = new Universe(N,seed);
        gol = new GameOfLife();

        play();
    }

    public static void play() throws InterruptedException {
        int i =1;
        while (!pause){
            Generation.next(universe);
            gol.setUniverse(universe);
            gol.repaint();
            gol.aliveLabel.setText("   Alive: " + universe.getAlive());
            gol.generationLabel.setText("   Generation #" + i);
            Thread.sleep(100);
            i++;
        }
    }

    public static void reset(){
    }
}

GameOfLife.java

package life;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GameOfLife extends JFrame implements ActionListener{
    public JLabel aliveLabel = new JLabel();
    public JLabel generationLabel = new JLabel();
    public JToggleButton playToggleButton = new JToggleButton("Pause");
    private Universe universe;
    private int N; //universe size;

    public GameOfLife() {
        super("Game Of Life");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLayout(null);
        setSize(501, 561);

        JPanel dataPanel = new JPanel();
        dataPanel.setLayout(new BoxLayout(dataPanel, BoxLayout.Y_AXIS));
        dataPanel.setBounds(0,0,200,40);
        dataPanel.setBackground(Color.YELLOW);
        add(dataPanel);
        generationLabel.setName("GenerationLabel");
        generationLabel.setText("Generation #0");
        dataPanel.add(generationLabel);
        aliveLabel.setName("AliveLabel");
        aliveLabel.setText("Alive: 0");
        dataPanel.add(aliveLabel);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.X_AXIS));
        buttonPanel.setBounds(200,0,301,40);
        buttonPanel.setBackground(Color.ORANGE);
        add(buttonPanel);
        playToggleButton.setName("PlayToggleButton");
        playToggleButton.addActionListener(this);
        buttonPanel.add(playToggleButton);
        JButton resetButton = new JButton("Reset");
        resetButton.setName("ResetButton");
        resetButton.addActionListener(new ResetListener());
        buttonPanel.add(resetButton);

        JPanel gamePanel = new JPanel() {
            public void paintComponent(Graphics g) {
                int i = 0, j = 0;
                Graphics2D g2 = (Graphics2D) g;
                for (int x = 0; i < N; x = x + (500 / N)) {
                    for (int y = 0; j < N; y = y + (500 / N)) {
                        if (universe.getMap()[i][j].equals("O"))
                            g2.fillRect(x,y,500 / N,500 / N);
                        else
                            g2.drawRect(x,y,500 / N,500 / N);
                        j++;
                    }
                    i++;
                    j = 0;
                }
            }
        };
        gamePanel.setBounds(0,40,501,501);
        add(gamePanel);

        setVisible(true);
    }

    public void setUniverse(Universe universe) {
        this.universe = universe;
        N = universe.getMap().length;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (playToggleButton.getText().equals("Pause")) {
            playToggleButton.setText("Play");
            Main.setPause(true);
        }
        else {
            playToggleButton.setText("Pause");
            Main.setPause(false);
            try {

               Main.play();
            } catch (InterruptedException ex) {
                System.out.println("ERROR");
            }
        }
    }


    public class ResetListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            Main.reset();
        }
    }

}

Generation.java

package life;

public class Generation {

    public static void next (Universe universe){
        int N = universe.getMap().length;
        String[][] nextMap = new String[N][N];
        for (int y = 0; y<N; y++){
            for (int x = 0; x<N; x++){
                if (universe.getMap()[y][x].equals("O")){
                    if (checkNeighbors(universe.getMap(),x,y) == 3) nextMap[y][x] = "O";
                    else if (checkNeighbors(universe.getMap(),x,y) == 2) nextMap[y][x] = "O";
                    else {
                        nextMap[y][x] = " ";
                        universe.decAlive();
                    }
                }
                else if (universe.getMap()[y][x].equals(" ")){
                    if (checkNeighbors(universe.getMap(),x,y) == 3) {
                        nextMap[y][x] = "O";
                        universe.incAlive();
                    }
                    else nextMap[y][x] = " ";
                }
            }
        }

        universe.setMap(nextMap);
    }

    private static int checkNeighbors(String[][] map, int x, int y){
        int neighbors = 0;
        int N = map.length;
        int xPlus,xMinus,yPlus,yMinus;
        
        if (x == N-1) {xPlus = 0; xMinus = x-1;}
        else if (x == 0) {xPlus = x+1; xMinus = N-1;}
        else {xPlus = x+1; xMinus = x-1;}

        if (y == N-1) {yPlus = 0; yMinus = y-1;}
        else if (y == 0) {yPlus = y+1; yMinus = N-1;}
        else {yPlus = y+1; yMinus = y-1;}
        
        
            if (map[y][xMinus].equals("O")) neighbors++;
            if (map[y][xPlus].equals("O")) neighbors++;
            if (map[yPlus][xMinus].equals("O")) neighbors++;
            if (map[yPlus][xPlus].equals("O")) neighbors++;
            if (map[yMinus][xMinus].equals("O")) neighbors++;
            if (map[yMinus][xPlus].equals("O")) neighbors++;
            if (map[yMinus][x].equals("O")) neighbors++;
            if (map[yPlus][x].equals("O")) neighbors++;

        return neighbors;
    }
}

Universe.java

package life;

import java.util.Random;

public class Universe {
    private String[][] map;
    private int N;
    private int alive = 0;

    public int getAlive() {
        return alive;
    }

    public void incAlive() {
        alive++;
    }

    public void decAlive() {
        alive--;
    }

    public String[][] getMap() {
        return map;
    }

    public void setMap(String[][] map) {
        this.map = map;
    }

    public Universe(int N, long seed) {
        this.N = N;
        map = new String[N][N];
        Random rnd = new Random(seed);

        for (int i = 0; i<N; i++){
            for (int j = 0; j<N; j++){
                if (rnd.nextBoolean()) {
                    map[j][i] = "O";
                    alive++;
                }
                else map[j][i] = " ";
            }
        }
    }

    public void printMap(){
        for (int i = 0; i<N; i++){
            for (int j = 0; j<N; j++){
                System.out.print(map[j][i]);
            }
            System.out.println();
        }
    }
}


Ответы (0 шт):