0 / 0 / 0
Регистрация: 15.05.2013
Сообщений: 5

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

15.05.2013, 16:58. Показов 9540. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru