Java - не может присвоить значение в invokeAndWait глобальной строковой переменной - PullRequest
0 голосов
/ 29 февраля 2012

Я разрабатываю приложение, использующее 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 Ответ

1 голос
/ 29 февраля 2012

Я предполагаю, что вы хотите получить доступ к sReader из какой-то другой части кода. В этом случае рассмотрите возможность сделать sReader энергозависимым, а также назначьте его перед выполнением Runnable Кроме того, если sBuffer используется только для создания String для использования в Runnable, рассмотрите возможность сделать его окончательной локальной переменной.

private volatile String sReader = "";
...

final String sBuffer = new String(bBuffer);
sReader = sBuffer;

SwingUtilities.invokeAndWait(
...
...