JavaFX построение графика большего объема?
Не так давно работаю с javaFX. Пишу небольшие программки для логгирования информации с приборов для испытательной лаборатории. Встала проблема визуализации. С выводом до 4000 точек LineChart скрепя справляется, в принципе все хорошо. Но например 56000 точек занимает 1 минуту 16 секунд, 100000 я ждал 5 минут, стоит задача выводить 30 минутный лог с прибора который шлет 400 посылок в секунду, в каждой посылке содержится значение от 8 датчиков то есть это 5 760 000 +-100. Вопрос №1 подскажите есть ли какие-то инструменты для построения графика такого объема? (я думаю что есть но к сожалению за неделю я не нашел примера который бы с этим справился) Вопрос №2 желательно строить такой график в режиме реального времени. До этого делал подобные скрипты на Python там все легко и просто. привожу свой кусок кода для построения :
protected Void call() throws Exception {
System.out.println("go");
lineChart.getData().clear();
XYChart.Series series = new XYChart.Series();
series.setName("chanel1");
XYChart.Series series1 = new XYChart.Series();
series1.setName("chanel2");
XYChart.Series series2 = new XYChart.Series();
series2.setName("chanel3");
XYChart.Series series3 = new XYChart.Series();
series3.setName("chanel4");
lineChart.setHorizontalGridLinesVisible(false);
lineChart.setVerticalGridLinesVisible(false);
lineChart.setCreateSymbols(false);
lineChart.setCache(true);
FileReader fl = new FileReader(tfPath.getText());
Scanner scan = new Scanner(fl);
int j = 0;
int boundUp = 0;
int boundLow = 65535;
while (scan.hasNext()) {
String[] s = scan.nextLine().split(",");
int[] acp = new int[s.length];
int finalJ = j;
for (int i = 0; i < s.length; i++) {
acp[i] = Integer.valueOf(s[i]);
if (boundUp<acp[i]) {
boundUp = acp[i]+300;
System.out.println(boundUp);
}
if (boundLow>acp[i]) {
boundLow = acp[i]-100;
System.out.println(boundLow);
}
}
y.setUpperBound(boundUp);
y.setLowerBound(boundLow);
Platform.runLater(() -> series.getData().add(new XYChart.Data(String.valueOf(finalJ), acp[0])));
Platform.runLater(() -> series1.getData().add(new XYChart.Data(String.valueOf(finalJ), acp[1])));
Platform.runLater(() -> series2.getData().add(new XYChart.Data(String.valueOf(finalJ), acp[2])));
Platform.runLater(() -> series3.getData().add(new XYChart.Data(String.valueOf(finalJ), acp[3])));
System.out.println("№"+j+" " +acp[0]+" " +acp[1]+" " +acp[2]+" " +acp[3]);
j++;
//fl.close();
}
fl.close();
Platform.runLater(() ->lineChart.getData().addAll(series, series1, series2, series3));
return null;
}
};
Ответы (1 шт):
Так как готового решения не нашлось (что очень странно конечно) я нашел свой выход. Он заключается в прорисовывании графиков с помощью Line на ScrollPane, пришлось правда повозиться с адаптацией размеров, но все реально. Время загрузки графиков из 56000 точек сократилось с 1м 16сек. до 4сек. что меня полностью устраивает.