Java - не может присвоить значение в invokeAndWait глобальной строковой переменной
Я занимаюсь разработкой приложения с использованием API java-simple-serial-connector для чтения и записи в последовательный порт. Я сталкиваюсь с проблемой, когда пытаюсь прочитать байты данных и назначить их глобальной переменной String (sReader). sReader не получает всю строку, и ее длина каждый раз случайна. Я уверен, что я получаю все байты, потому что, когда я добавляю строку sBuffer к Output (Output.append), вся строка отображается всегда. Пожалуйста, посмотрите на мой пример кода ниже:
public class SerialPortTest extends javax.swing.JFrame {
private String sReader = "";
private JTextArea outputTextArea;
private JLabel outputLabel;
private class Reader implements SerialPortEventListener {
private String sBuffer = "";
@Override
public void serialEvent(SerialPortEvent spe) {
if (spe.isRXCHAR() || spe.isRXFLAG()) {
if (spe.getEventValue() > 0) {
try {
//Read chars from buffer
byte[] bBuffer = serialPort.readBytes(spe.getEventValue());
sBuffer = new String(bBuffer);
SwingUtilities.invokeAndWait(
new Runnable() {
@Override
public void run() {
sReader = sBuffer;//does not assign full string
outputLabel.setText(sBuffer);//does not set full string
outputTextArea.setText(sBuffer);//does not set full string
outputTextArea.append(sBuffer);//This works! Why the above don't work?
}
});
} catch (SerialPortException | InterruptedException | InvocationTargetException ex) {
}
}
}
}
}
}
1 ответ
Я предполагаю, что вы хотите получить доступ к sReader из какой-то другой части кода. В этом случае подумайте о том, чтобы сделать sReader энергозависимым, а также назначить его перед выполнением Runnable. Кроме того, если sBuffer используется только для создания String для использования в Runnable, рассмотрите возможность сделать его окончательной локальной переменной.
private volatile String sReader = "";
...
final String sBuffer = new String(bBuffer);
sReader = sBuffer;
SwingUtilities.invokeAndWait(
...