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

Узнай цену своей работы

Формулировка задачи:

Добрый вечер! Прошу о помощи знатоков Java (в частности JavaFX, FXML). Пишу программу что-то наподобие монитора последовательных COM портов. Использую библиотеку jSSC. Часть кода взята из интернета и она является стандартным шаблоном для работы с COM портами (jSSC). Вот эта часть:
Листинг программы
  1. private class PortReader implements SerialPortEventListener {
  2. String data = "";
  3. public void serialEvent(SerialPortEvent event) {
  4. if(event.isRXCHAR() && event.getEventValue() > 2){
  5. try {
  6. data = serialPort.readString(event.getEventValue());
  7. if ((data != "") && (data != null)) {
  8. //Platform.runLater(new Runnable() {
  9. // @Override public void run() {
  10. // txtBytes.appendText(data);
  11. // }
  12. // });
  13. //txtBytes.appendText(data);
  14. //System.out.print(data);
  15. }
  16. } catch (SerialPortException ex) { System.out.println(ex); }
  17. }
  18. }
  19. }
В COM порт приходят сообщения от девайса каждые 50-100 миллисекунд. (В рабочем варианте такой частоты не будет скорее всего, но хочется чтобы все работало корректно) А проблема вся состоит в выоде этих данных в TextArea (@FXML TextArea txtBytes; ). При попытке вывести текст строкой:
Листинг программы
  1. txtBytes.appendText(data);
Выводится все почти корректно (иногда пропускает символы), но около 100-120 строк и потом происходит java.lang.NullPointerException. Если вывести с помощью следующего кода:
Листинг программы
  1. Platform.runLater(new Runnable() {
  2. @Override public void run() {
  3. txtBytes.appendText(data);
  4. }
  5. });
ошибки не выдает, но корректно работает только в начале, а потом начинает нещадно пропускать символы и глючить! А если выводить в консоль (что мне не нужно, задача вывести в TextArea):
Листинг программы
  1. System.out.print(data);
Все выводится идеально и без ошибок! Помогите советом, как выкрутится!?

Решение задачи: «Быстрый вывод данных в TextArea (FXML)»

textual
Листинг программы
  1. [JAVA]class MySerialPortEventListener implements SerialPortEventListener {  
  2.        
  3.         @Override
  4.        public void serialEvent(SerialPortEvent serialPortEvent) {
  5.                                
  6.             if(serialPortEvent.isRXCHAR()){                
  7.                 try {        
  8.                     int byteCount = serialPortEvent.getEventValue();
  9.                            
  10.                     byte bufferIn[] = serialPort.readBytes(byteCount);
  11.                    
  12.                    // System.out.println(byteCount); //кол-во байт в пакете, пока не используем
  13.                    
  14.                      String stringIn = "";                    
  15.                  
  16.                      try {                            
  17.                          stringIn = new String(bufferIn,"UTF-8");                  
  18.                      
  19.                           System.out.print(stringIn ); // консоль на НетБинс                        
  20.                                                  
  21.                     } catch (UnsupportedEncodingException ex) {
  22.                         Logger.getLogger(Baychi.class.getName()).log(Level.SEVERE, null, ex);  
  23.                     }
  24.                            
  25.                              textFieldIn.appendText(stringIn);
  26.                                
  27.                                  
  28.                 } catch (SerialPortException ex) {
  29.                     Logger.getLogger(Baychi.class.getName()).log(Level.SEVERE, null, ex);                    
  30.                
  31.             }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут