Я думаю, что ваша проблема в том, что Java не позволит вам обновлять графический интерфейс из другого потока, кроме самого потока графического интерфейса. В какой-то момент это вызывает у всех горе, но, к счастью, найдется достаточно удобный обходной путь.
Идея состоит в том, чтобы передать код, который выполняет обновление как Runnable
, методу SwingUtilities.invokeAndWait
или SwingUtilities.invokeLater
. Вот пример .
Чтобы ваша ГА работала на максимальной скорости и использовала параллелизм, я думаю, invokeLater
подойдет.
РЕДАКТИРОВАТЬ: Ой, подождите, решение Camickr намекает, что вы делаете что-то еще: вы запускаете GA в потоке GUI. Ну, это может сделать только один или другой, рассчитать или отобразить. Таким образом, истинное решение объединит оба изменения:
- Запустите GA в отдельном потоке (вы можете запустить его в потоке, используемом
main()
после создания GUI); и
- Используйте
invokeLater
для передачи обновлений в поток GUI (который camickr вызывает EDT, или поток диспетчеризации событий).