Пользовательское событие JLabel setText - PullRequest
0 голосов
/ 27 февраля 2019

Итак, у меня есть два класса, один - Observer, а другой - Observable.У наблюдаемой есть char variable, который изменяется, и когда он меняется, вызывается событие ChangeTurnListener с его методом onChangeTurn() и передачей этой переменной в качестве аргумента.

Все отлично работает,переменная char присутствует в наблюдателе, но JLabel, похоже, не обновляет текст.Я пытался использовать repaint(), не повезло.Также попытался использовать paintImmediately() на JLabel, и он появляется на короткую секунду, а затем отключается.

Я просто пытаюсь сделать следующее:

@Override
public void onChangeTurn(String whoseMove) {
    System.out.println("OnChangeTurn ran");
    System.out.println("WhoseMove passed through onChangeTurn: " + whoseMove);
    jlTurn.setText("It's your turn " + whoseMove);
}

У меня естьЯ понял, что это проблема с JLabel, поэтому я попытался использовать firePropertyChanged(...) на JLabel, но все равно не повезло.

Я предполагаю, что это, возможно, связано с параллелизмом в Java Swing.

Это работает, если я просто устанавливаю текст в произвольный текст, но не в том случае, если я предоставляю ему аргумент whoMove.

Заранее спасибо.

1 Ответ

0 голосов
/ 27 февраля 2019

Как отметил @Oleksandr в своем комментарии.В приложении java Swing , то есть в приложении, использующем классы из пакета javax.swing, например JLabel, запускается специальный поток.Этот поток известен под многими именами, включая Поток рассылки событий или EDT.Как указал @Oleksandr, ваш код, который вызывает метод setText() в классе JLabel , должен выполняться в этом потоке.Упомянутый класс @Oleksandr - javax.swing.SwingUtilities - также содержит [статический] метод isDispatchThread(), который возвращает true при вызове из EDT.Если не вызывается из EDT, вы можете вызвать метод invokeLater(), также в классе SwingUtilities, который гарантирует, что он будет выполняться в EDT.

...