2010-07-27 2 views
1

У меня есть графический интерфейс пользователя, который имеет текстовое поле и кнопки и т.д .........Java GUI и темы

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

В классе, содержащем textarea, у меня есть методы getter для текстового поля. Я также объявил, что класс (содержащий текстовую область) как переменную в классе потоков.

Я пытаюсь вызвать метод get textarea для переменной, а затем метод append(), но текстовое поле не обновляется.

что я делаю неправильно?

благодарит за вашу помощь.

+0

Попробуйте изменить заголовок на что-то более близкое к вопросу. Таким образом, люди, просматривающие листинг, узнают, в чем вопрос. – helios

+0

Метод «append» является потокобезопасным. Поэтому, если вы не видите текст в графическом интерфейсе, у вас нет надлежащей ссылки на видимую текстовую область. Возможно, вы создали две области текста по ошибке. Попробуйте добавить System.out.println (textArea.getText()), чтобы вы могли видеть, добавляете ли вы текст в видимую область текста. – camickr

ответ

5

Главное, что вам нужно соблюдать следующие рекомендации, данные Sun в соответствии с управлением потоками с помощью Swing, вы можете посмотреть here.

Что вы поймете, так это то, что вам нужно отправлять события, связанные с графическим интерфейсом, с SwingUtilities.invokeLater(..) и SwingUtilities.invokeAndWait(..) в соответствии с вашим конкретным случаем. Это связано с тем, что событиями GUI управляет Event Dispatching Thread, и вы не должны управлять ими в своих потоках.

+0

В некоторых документах Swing (меньше в JDK 7 ...) указано, что некоторые методы являются потокобезопасными. Такие комментарии часто не согласуются с реализацией или любой возможной реализацией. Также код, пытающийся использовать такие методы в потоковом режиме, скорее всего, будет иметь собственные ошибки потоков. –

1

Вы не должны вызывать методы пользовательского интерфейса из потока, отличного от UI. Чтобы вызвать методы из потока, отличного от UI, вы должны использовать специальный метод пользовательского интерфейса, который говорит «отправить часть кода в поток пользовательского интерфейса для выполнения». В SWT это Display.getDefault().asyncExec(Runnable). Для Swing используйте SwingUtilities.invokeLater().

Для получения дополнительной информации см. this article.