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

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

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

Добрый вечер! Прошу о помощи знатоков Java (в частности JavaFX, FXML). Пишу программу что-то наподобие монитора последовательных COM портов. Использую библиотеку jSSC. Часть кода взята из интернета и она является стандартным шаблоном для работы с COM портами (jSSC). Вот эта часть:
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; ). При попытке вывести текст строкой:
txtBytes.appendText(data);
Выводится все почти корректно (иногда пропускает символы), но около 100-120 строк и потом происходит java.lang.NullPointerException. Если вывести с помощью следующего кода:
Platform.runLater(new Runnable() {
    @Override public void run() {
        txtBytes.appendText(data);
        }
});
ошибки не выдает, но корректно работает только в начале, а потом начинает нещадно пропускать символы и глючить! А если выводить в консоль (что мне не нужно, задача вывести в TextArea):
System.out.print(data);
Все выводится идеально и без ошибок! Помогите советом, как выкрутится!?

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

textual
Листинг программы
[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);                    
                
            }

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


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

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

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