перестает перерисовываться 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();
}
}
}