Почему я не могу вызвать функцию, находясь в потоке? - PullRequest
0 голосов
/ 31 августа 2018

Я многопоточен фоновым процессом в окне JFrame и хочу обновить текст глобальной переменной JLabel внутри функции.

Поэтому, когда поток запускается, циклы while и for запускаются, но во время их выполнения он вызывает эту другую функцию для изменения текста.

Однако, он не обновляется, пока не завершится выполнение потока (то есть, когда завершатся циклы). Любая причина, почему это происходит, и как я могу это исправить?

Если я попытаюсь просто изменить текст JLabel внутри потока, результат будет тот же.

1 Ответ

0 голосов
/ 31 августа 2018

Возможно, ваш поток внес изменения, но экран не обновляется до тех пор, пока не появится поток рассылки событий Swing и не обновит экран. Рекомендуется и безопаснее вызывать методы обновления пользовательского интерфейса, используя поток диспетчеризации событий Swing. Вы можете сделать это, поместив код обновления графического интерфейса в этот метод:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        // call gui update here
    }
});

Это все еще не решает вашу проблему (обновление происходит после завершения выполнения потока). Это только для того, чтобы прямо указать, что вы имеете дело с двумя потоками здесь. Ваш цикл for в отдельном потоке, скорее всего, закончится первым, потому что поток рисования обычно медленнее. Однако, зная это, вы сможете спланировать, какой код будет передаваться потоку событий Swing. Если вы действительно хотите, чтобы цикл for обновлялся в этот момент времени, вы можете поместить весь цикл for в invokeLater().

...