Вместо обновления trainImage
, установите новый ImageIcon
на JLabel
imageLabel.setIcon(new ImageIcon(bImage));
Вам также может понадобиться вызвать revalidate
и / или repaint
на метке для запускановый макет / проход для рисования.
Лично я бы вернул BufferedImage
из метода train
, поскольку метод train
действительно не должен обновлять пользовательский интерфейс, это не его работа.
Когда я нажимаю кнопку "поезд", графический интерфейс останавливается и не отвечает до тех пор, пока не будет выполнен метод train ().
Да, именно поэтому Swing, как и большинство пользовательских интерфейсовИнструментарий, однопоточный.Это означает, что если вы выполняете какие-либо блокирующие или длительные операции в контексте потока диспетчеризации событий, это не позволит ему обновлять пользовательский интерфейс или реагировать на любые пользовательские входные данные.
См. Параллельность в Swing для более подробной информации.
"A" возможным решением будет использование SwingWorker
.Это позволяет вам выполнить операцию блокировки / длительного запуска в другом потоке, но предоставляет несколько способов безопасной синхронизации обновлений обратно с пользовательским интерфейсом (Swing также не является поточно-безопасным;))
См. Рабочие темы и SwingWorker для более подробной информации