Обновите JLabel из другого потока

Уважаемые ребята, у меня проблема со свингом. Я не могу поделиться кодом, так как это противоречит политике компании, поэтому я постараюсь объяснить проблему.

Короче говоря, я создал класс, который расширяет JWindow и содержит JLabel. Текст этого JLabel обновляется случайным образом через объект таймера, который создает экземпляр TimerTask каждые 50 мс, используя метод scheduleAtFixedRate. Значения в JLabel извлекаются путем вызова метода в отдельном потоке (назовем его потоком передачи), который обрабатывает передачу данных на определенное устройство. Проблема в том, что JWindow появляется на экране без содержимого до тех пор, пока передача на устройство не закончится, тогда я получу последний результат потока передачи. В чем проблема?


person Mouhammed Soueidane    schedule 05.05.2011    source источник
comment
Можете ли вы поделиться другим кодом, который иллюстрирует проблему?   -  person Peter Lawrey    schedule 05.05.2011
comment
Я предполагаю, что вы обращаетесь к устройству в потоке графического интерфейса, что предотвращает обновление графического интерфейса. Вам необходимо убедиться, что поток графического интерфейса не блокируется на устройстве или не блокируется, когда вы хотите, чтобы он обновлял графический интерфейс.   -  person Peter Lawrey    schedule 05.05.2011
comment
Нет, Питер, на самом деле я создаю объект JWindow из класса-посредника. Класс посредника запускает поток передачи при первой загрузке. Этот же класс посредника имеет JButton, который запускает передачу данных, вызывая метод в потоке передачи. Прямо перед началом передачи этот же класс-посредник создает JWindow, содержащий JLabel, который обновляет свое значение из функции внутри потока передачи.   -  person Mouhammed Soueidane    schedule 05.05.2011
comment
Вам нужно получить трассировку стека, чтобы узнать, что делает приложение, когда оно должно обновлять JWindow, но не обновляет его.   -  person Peter Lawrey    schedule 05.05.2011
comment
Что вы подразумеваете под вызовом метода в потоке передачи? Тот факт, что метод находится в вашем классе TransmissionThread или классе TransmissionRunnable, не означает, что он выполняется в потоке передачи. Без кода помочь сложно.   -  person JB Nizet    schedule 05.05.2011
comment
Я не могу поделиться кодом, так как это противоречит политике компании. Какое это имеет отношение к чему-либо? Мы никогда не запрашиваем ваш производственный код. Мы просим что-то, что ДЕМОНСТРИРУЕТ проблему. Весь смысл создания SSCCE заключается в удалении ненужного кода. Ваш вопрос просто о таймерах. В этом есть особенность, все используют таймеры.   -  person camickr    schedule 05.05.2011


Ответы (2)


Проблема заключается в том, что вы получаете доступ к компонентам Swing в других потоках, а не в потоке отправки событий (EDT). Это запрещено.

В javadoc каждого компонента Swing есть ссылка на эту страницу: http://download.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading, где подробно объясняется политика многопоточности.

person JB Nizet    schedule 05.05.2011

Вместо java.util.Timer может быть больше javax.swing.Timer удобно, как показано в этом примере.

person trashgod    schedule 05.05.2011