Одна из ваших основных проблем заключается в том, что вы пытаетесь запустить длинный процесс в потоке событий Swing, также известном как поток обработки событий или EDT, и это фактически приведет к зависанию вашей программы. Я вижу эту проблему, возникающую здесь:
class ButtonListener {
public void addActionListener(ActionEvent e) throws InterruptedException {
JButton source = (JButton) e.getSource();
// ...
while (paused = false) { // *******
nextGen();
Thread.sleep(1000); // ******
}
}
// ...
}
у вас есть и цикл while(true)
, и Thread.sleep(...)
, ни один из которых не должен вызываться в потоке событий.
Вместо этого вы должны использовать Swing Timer .
Подробнее о ветке событий Swing читайте Параллельность в Swing .
Также (1), где вы позволяете клеткам инициализироваться, чтобы они были живы? Без живых клеток для начала все поколения не покажут ничего, кроме пустой сетки? Вам нужно добавить MouseListener к одному или нескольким вашим компонентам? Я думаю, что это было бы хорошей идеей.
Также (2) кнопки обычно работают намного лучше, когда вы добавляете к ним ActionListener, как хорошо описано в руководстве по Swing button . Вы прошли учебники Swing? Если нет, пожалуйста, проверьте их (найдите их здесь ), так как они, я думаю, вам очень помогут.
Также (3) вы можете откусывать больше, чем можете прожевать, пытаясь решить слишком много проблем за один раз. Когда я создаю GUI, похожий на этот, мне нравится работать над каждой частью программы изолированно и сначала заставить ее работать, прежде чем объединить все в одну большую программу. Так, например, сначала поработайте над моделью без графического интерфейса и заставьте поколения работать, запустив ее через тестовый код, который вызывает методы модели. Затем поочередно работайте с каждой частью графического интерфейса, включая JButtons, затем MouseListener, затем отображение игры жизни, затем реализацию поколений.
Намного легче отлаживать тестовые программы меньшего размера, чем пытаться отлаживать весь shebang, поверьте мне.