DynamicTimeSeriesCollection и последовательная связь

1

Я использую DynamicTimeSeriesCollection для построения измерений из последовательного порта в мой график. Я хочу использовать код, который я нашел в другом сообщении.

Я хочу добиться чего-то подобного: использование JFreeChart для отображения последних изменений во временном ряду

Код из другого сообщения, которое я нашел:

Как совместить код Java-графика и последовательный код Java для считывания значения датчика Arduino?

1. Move dataset and newData up to become instance variables:

DynamicTimeSeriesCollection dataset;
float[] newData = new float[1];

2. Add a method that appends your data to the chart dataset:

public synchronized void addData(byte[] chunk) {
    for (int i = 0; i < chunk.length; i++) {
        newData[0] = chunk[i];
        dataset.advanceTime();
        dataset.appendData(newData);
    }
}

3. Invoke the method from serialEvent():

demo.addChunk(chunk);

Вот мой метод Serial Event в классе SerialCommunication:

public void serialEvent(SerialPortEvent oEvent) {
    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try
        {
            Date d = new Date();
            SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String datetime = dt.format(d);
            String inputLine = input.readLine();

            String[] measurements = inputLine.split(",");
            double humidity = Double.parseDouble(measurements[0]);
            double temp = Double.parseDouble(measurements[1]);
            double ldr = Double.parseDouble(measurements[2]);
            humidityList.add(humidity);
            tempList.add(temp);
            ldrList.add(ldr);

            System.out.println(datetime+" > "+inputLine);
        }
        catch (Exception e) {
            System.err.println(e.toString());
        }
    }
}

И ArrayList в классе Serial Communication:

private ArrayList<Double> humidityList = new ArrayList<Double>();
private ArrayList<Double> tempList = new ArrayList<Double>();
private ArrayList<Double> ldrList = new ArrayList<Double>();

Вот как я объявлял ArrayList в GUI-классе:

private static ArrayList<Double> m1;
private static ArrayList<Double> m2;
private static ArrayList<Double> m3;


public GUI(final String title,ArrayList<Double> humidity,ArrayList<Double> temp,ArrayList<Double> ldr) 
{

super(title);
m1 = humidity;
m2 = temp;
m3 = ldr;

Я попытался изменить код, который я нашел с моими измерениями, но не повезло. Любая идея, как я могу это достичь?

Теги:
dynamic
time-series
serial-port
jfreechart

1 ответ

1
Лучший ответ

SwingWorker - лучший способ справиться с этим.

  • Создайте класс Measurement содержащий три Double атрибута.

  • Расширить SwingWorker<Measurement, Measurement>

  • В вашей реализации doInBackground(), publish() каждый Measurement мере его поступления.

  • В вашей реализации process() обновите набор данных диаграммы, как предлагается здесь и здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню