Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/50: Рейтинг темы: голосов - 50, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 15.05.2013
Сообщений: 5

Быстрый вывод данных в TextArea (FXML)

15.05.2013, 16:58. Показов 9433. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!

Прошу о помощи знатоков Java (в частности JavaFX, FXML).
Пишу программу что-то наподобие монитора последовательных COM портов. Использую библиотеку jSSC.
Часть кода взята из интернета и она является стандартным шаблоном для работы с COM портами (jSSC).

Вот эта часть:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private class PortReader implements SerialPortEventListener {
    String data = "";
        
    public void serialEvent(SerialPortEvent event) {
        if(event.isRXCHAR() && event.getEventValue() > 2){
            try {
                data = serialPort.readString(event.getEventValue());
                if ((data != "") && (data != null)) {
                        //Platform.runLater(new Runnable() {
                        //     @Override public void run() {
                        //        txtBytes.appendText(data);
                        //     }
                        //     });  
                        
                        //txtBytes.appendText(data);
                        
                        //System.out.print(data);
                    }
            } catch (SerialPortException ex) { System.out.println(ex); }
            }
        }
}
В COM порт приходят сообщения от девайса каждые 50-100 миллисекунд. (В рабочем варианте такой частоты не будет скорее всего, но хочется чтобы все работало корректно)

А проблема вся состоит в выоде этих данных в TextArea (@FXML TextArea txtBytes; ).
При попытке вывести текст строкой:
Java
1
txtBytes.appendText(data);
Выводится все почти корректно (иногда пропускает символы), но около 100-120 строк и потом происходит java.lang.NullPointerException.

Если вывести с помощью следующего кода:
Java
1
2
3
4
5
Platform.runLater(new Runnable() {
    @Override public void run() {
        txtBytes.appendText(data);
        }
});
ошибки не выдает, но корректно работает только в начале, а потом начинает нещадно пропускать символы и глючить!

А если выводить в консоль (что мне не нужно, задача вывести в TextArea):
Java
1
System.out.print(data);
Все выводится идеально и без ошибок!

Помогите советом, как выкрутится!?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2013, 16:58
Ответы с готовыми решениями:

Быстрый вывод данных из потока
Приветствую. Для максимально быстрого вывода данных из потока в окно я создал нижеприведенный шаблон. В классе потока созданы переменные по...

Сравнение данных в двух textarea и вывод данных
Добрый день! Возникла такая проблема, сразу скажу что в javascript слабо разбираюсь В 2 textarea построчно вставляются данные,...

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

10
 Аватар для AckiyBolt
653 / 402 / 35
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
15.05.2013, 17:28
вот это место подробней плз:

Java
1
2
3
4
5
Platform.runLater(new Runnable() {
    @Override public void run() {
        txtBytes.appendText(data);
        }
});
у вас скорее всего проблемы с синхронизацией
1
0 / 0 / 0
Регистрация: 15.05.2013
Сообщений: 5
15.05.2013, 19:59  [ТС]
Стыдно сказать но я не силен в потоках Java, но предполагаю, что блок
Java
1
2
3
4
5
Platform.runLater(new Runnable() {
    @Override public void run() {
        txtBytes.appendText(data);
        }
});
это добавление текста в отдельном потоке...
В принципе да... и логично что они разсинхронизированные получаются...

Есть ли способ попроще!?
Я не понимаю почему вариант с
Java
1
txtBytes.appendText(data);
приводит к ошибке java.lang.NullPointerException!

0
 Аватар для AckiyBolt
653 / 402 / 35
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
15.05.2013, 20:17
для начала вот это
Java
1
if ((data != "") && (data != null))
поменяйте на это
Java
1
if (  data != null && !data.equals("") ) {
а по поводу нпе - скажите в какой строке вылетает и выложите стактрейс полностью
1
0 / 0 / 0
Регистрация: 15.05.2013
Сообщений: 5
16.05.2013, 01:49  [ТС]
Не помогает

строка
Java
1
txtBytes.appendText(data);
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Exception in thread "EventThread COM5" java.lang.NullPointerException
    at com.sun.javafx.sg.prism.NGTextHelper$TextAttributes.computeLinePadding(NGTextHelper.java:405)
    at com.sun.javafx.sg.prism.NGTextHelper$TextAttributes.access$200(NGTextHelper.java:292)
    at com.sun.javafx.sg.prism.NGTextHelper.buildTextLines(NGTextHelper.java:2357)
    at com.sun.javafx.sg.prism.NGTextHelper.validateText(NGTextHelper.java:1847)
    at com.sun.javafx.sg.prism.NGTextHelper.getCaretShape(NGTextHelper.java:1435)
    at javafx.scene.text.Text.getDecorationShapes(Text.java:1150)
    at javafx.scene.text.Text.impl_geomChanged(Text.java:757)
    at javafx.scene.text.Text$1.invalidated(Text.java:214)
    at javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:127)
    at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:161)
    at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:67)
    at javafx.scene.text.Text.setText(Text.java:188)
    at com.sun.javafx.scene.control.skin.TextAreaSkin$17.invalidated(TextAreaSkin.java:610)
    at com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:359)
    at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:100)
    at javafx.scene.control.TextInputControl$TextProperty.fireValueChangedEvent(TextInputControl.java:1034)
    at javafx.scene.control.TextInputControl$TextProperty.markInvalid(TextInputControl.java:1038)
    at javafx.scene.control.TextInputControl$TextProperty.invalidate(TextInputControl.java:978)
    at javafx.scene.control.TextInputControl$TextProperty.access$200(TextInputControl.java:950)
    at javafx.scene.control.TextInputControl$1.invalidated(TextInputControl.java:119)
    at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:155)
    at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:100)
    at javafx.scene.control.TextArea$TextAreaContent.insert(TextArea.java:196)
    at javafx.scene.control.TextInputControl.replaceText(TextInputControl.java:373)
    at javafx.scene.control.TextInputControl.insertText(TextInputControl.java:308)
    at javafx.scene.control.TextInputControl.appendText(TextInputControl.java:298)
    at javafxapplication2.SampleController$PortReader.serialEvent(SampleController.java:261)
    at jssc.SerialPort$EventThread.run(SerialPort.java:1089)
0
 Аватар для AckiyBolt
653 / 402 / 35
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
16.05.2013, 09:06
вот тот иф нада было поменять потому что

а вот с нпе... хз... может глубокий дебаг прояснит ситуацию. я затрудняюсь сказать в чем проблема
1
0 / 0 / 0
Регистрация: 15.05.2013
Сообщений: 5
16.05.2013, 11:24  [ТС]
Да спасибо про equals понял! Уже где-то на этом напарывался...
Эх а вот с NullPointerException действительно пока ничего не ясно

Все равно, спасибо за уделенное время!
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
16.05.2013, 13:01
Я думаю проблема именно в синхронизации, и она в том что нет синхронизированного контейнера для текста

Правильно было бы организовать синхронизированную очередь и пулять туда текст из ком порта,
а потом вызывать метод
Java
1
2
3
4
5
6
7
8
9
10
11
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                synchronized (queue) {
                    String line = null;
                    while ((line = queue.poll()) != null) {
                        txtBytes.appendText(line);
                    }
                }
            }
        });
1
 Аватар для AckiyBolt
653 / 402 / 35
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
16.05.2013, 13:11
мне кажется, там переархитектурить было бы неплохо. при каждом интерцепте новый поток создавать не есть гуд
1
0 / 0 / 0
Регистрация: 15.05.2013
Сообщений: 5
16.05.2013, 14:10  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
Я думаю проблема именно в синхронизации, и она в том что нет синхронизированного контейнера для текста

Правильно было бы организовать синхронизированную очередь и пулять туда текст из ком порта,
а потом вызывать метод
Java
1
2
3
4
5
6
7
8
9
10
11
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                synchronized (queue) {
                    String line = null;
                    while ((line = queue.poll()) != null) {
                        txtBytes.appendText(line);
                    }
                }
            }
        });
Да это вроде помогло!...
Спасибо!

мне кажется, там переархитектурить было бы неплохо. при каждом интерцепте новый поток создавать не есть гуд
Что-то пока слабо себе представляю как сделать иначе...


У меня теперь появилась другая проблема. Программка наглухо виснет при больших объемах текста в TextArea (>30Кб)!
Как вы считаете есть ли решение данной проблемы? Или нужно будет просто отсекать старые записи, тем самым не дав переполнятся TextArea?
0
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 6
23.01.2017, 13:50
Здравствуйте, не поделитесь кодом? Как организовать синхронизированную очередь и пулять туда текст из ком порта? У меня терминал слушает COM порт, данные приходят в textArea (и в консоль), но в textArea строки съезжают (в консоль всё нормально выводится). Заранее спасибо.
Вот кусок кода с выводом на консоль и в GUI:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[JAVA]class MySerialPortEventListener implements SerialPortEventListener {   
        
        @Override
       public void serialEvent(SerialPortEvent serialPortEvent) {
                               
            if(serialPortEvent.isRXCHAR()){                
                try {         
                    int byteCount = serialPortEvent.getEventValue();
                            
                    byte bufferIn[] = serialPort.readBytes(byteCount);
                    
                   // System.out.println(byteCount); //кол-во байт в пакете, пока не используем
                   
                     String stringIn = "";                     
                 
                     try {                             
                         stringIn = new String(bufferIn,"UTF-8");                  
                     
                          System.out.print(stringIn ); // консоль на НетБинс                         
                                                  
                    } catch (UnsupportedEncodingException ex) {
                        Logger.getLogger(Baychi.class.getName()).log(Level.SEVERE, null, ex);  
                    } 
                            
                             textFieldIn.appendText(stringIn);
                                
                                  
                } catch (SerialPortException ex) {
                    Logger.getLogger(Baychi.class.getName()).log(Level.SEVERE, null, ex);                    
                
            }
[/JAVA]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2017, 13:50
Помогаю со студенческими работами здесь

вывод и редактирование данных в textarea
Доброго времени суток помогите реализовать скрипт есть поле textarea, в него мы вводим данные и нажимаем сохранить, данные пишутся в...

Вывод данных в форму TEXTAREA
Гуру, подскажите плз., как осуществить вывод всех данных из БД в форму TEXTAREA. Исключительно для просмотра. Разумеется средствами пхп....

получение данных из textarea, их обработка и занесение в другой textarea
Добрый день! Нужна помощь по проблеме Есть html страница <html> <body> <form action="index.php"...

Загрузка данных из fxml-документа
имею код public class Main extends Application { private Stage primaryStage; private AnchorPane rootLayout; ...

Быстрый ввод и вывод
Добрый день. Прошу прощения за нубский вопрос, но все-таки... Хотелось бы узнать у гуру, какие операторы обеспечивают самый быстрой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru