powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как работает JTextPane???
7 сообщений из 7, страница 1 из 1
Как работает JTextPane???
    #38924785
sergnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема:
Есть фрейм на которам окно для вывода сообщений (собственно JTextPane)
и кнопка запуска программы
так пределяю JTextPane
Код: java
1.
2.
3.
4.
	StyleContext sc = new StyleContext();
	StyledDocument docOut = new DefaultStyledDocument(sc);
	JTextPane textPane = new JTextPane(docOut);
	Style Normal = sc.getStyle(StyleContext.DEFAULT_STYLE);



В обработчике кнопки:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
           docOut.insertString(docOut.getLength(), "Начало обработки\n", Normal);
/* блок каких-то  команды
------------------
*/
           docOut.insertString(docOut.getLength(), "Сообщение 1\n", Normal);

/* блок каких-то  команды
------------------
*/
           docOut.insertString(docOut.getLength(), "Сообщение 2\n", Normal);

// и так далее.....



Собственно проблем в том, что сообщения в окне появляются не сразу как они выводятся программой (то есть по мере отработки), а все скопом после после полной отработки программы. Учитывая, что программа работает довольно долго, хотелось бы, чтобы сообщения выводились сразу. Но как????
...
Рейтинг: 0 / 0
Как работает JTextPane???
    #38925122
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам нужен SwingWorker и понимание как работать с потоками в Swing
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

"блок каких-то команды" это ресурсоёмкая бизнес-логика. Она должна работать в параллельном потоке, чтобы не занимать Event Dispatch Thread (ETD), который отвечает за события и отрисовку GUI. Но после того как вы запустите свой процесс в фоновом потоке, вам нужно docOut.insertString() выполнять внутри EDT.

Кривой код может выглядеть так. Это просто наглядная демонстрация идеи.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
new Thread(){
 public void run(){           
           SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                         docOut.insertString(docOut.getLength(), "Начало обработки\n", Normal);
                }    
           });
/* блок каких-то команд, не работающих с GUI!!
------------------
*/
           SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                         docOut.insertString(docOut.getLength(), "Сообщение 1\n", Normal);
                }    
           });

/* блок каких-то команд, не работающих с GUI!!
------------------
*/
 }

}.start();



Конечно, стоит избавится от копипасты через новый метод. Но ещё лучше разобраться со SwingWorker. Тогда код будет ещё проще.
...
Рейтинг: 0 / 0
Как работает JTextPane???
    #38925157
sergnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

спасибо
буду разбираться
...
Рейтинг: 0 / 0
Как работает JTextPane???
    #38925171
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как работает JTextPane???
    #38926059
sergnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczКривой код может выглядеть так. Это просто наглядная демонстрация идеи.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
new Thread(){
 public void run(){           
           SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                         docOut.insertString(docOut.getLength(), "Начало обработки\n", Normal);
                }    
           });
/* блок каких-то команд, не работающих с GUI!!
------------------
*/
           SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                         docOut.insertString(docOut.getLength(), "Сообщение 1\n", Normal);
                }    
           });

/* блок каких-то команд, не работающих с GUI!!
------------------
*/
 }

}.start();





Попробовал этот способ. Естественно венес вызов insertString в отдельный метод.
Сообщения стали появлються не дожидаясь окончания основной программы.
НО!! Появляются не в порядке вызова из основной программы!
То есть получается что в EDT сообщения ставятся в достаточно произвольном порядке?
А не в порядке вызова из основной прграммы?
...
Рейтинг: 0 / 0
Как работает JTextPane???
    #38926077
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergnn,

Хм. Попробуйте тогда invokeAndWait() вместо invokeLater(). Я такого эффекта не наблюдал никогда.
Опять же. Лучше взять SwingWorker, я же привел ссылки на примеры.
...
Рейтинг: 0 / 0
Как работает JTextPane???
    #38926257
sergnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Ещё раз спасибо.
Всё получилось.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как работает JTextPane???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]