Самодельный Live linegraph - Холст / Графикаконтекст
Я пытаюсь сделать прямую диаграмму обновления, похожую на работу ЭКГ или других мониторов. У меня хорошая линия. Он шагает на 3 слева направо по мере добавления новых номеров.
У меня сейчас проблема в том, чтобы прокрутить его вправо. После долгих исследований я все еще в тупике.
Могу ли я сделать прокрутку холста? Нужно ли мне иметь все точки в некотором списке пар точек? Я пытался использовать XYChart.Series (пара точек), но у меня возникли проблемы с циклическим изменением и обновлением.
Я не могу понять, как получить линии, которые я создал на каждом графике, как объект, которым я могу перемещать или манипулировать. Я предполагаю, что это будет лучший способ вместо перерисовки холста каждый раз, когда добавляются новые данные.
Вот мой класс графика.
public class Graph {
public Double accval;
public Double sndval;
public Double litval;
public boolean accAlive = false;
public boolean sndAlive = false;
public boolean litAlive = false;
public Canvas accCanvas;
public Canvas sndCanvas;
public Canvas litCanvas;
public GraphicsContext accGFXContext;
public GraphicsContext sndGFXContext;
public GraphicsContext litGFXContext;
public int accPrevX = 3;
public int sndPrevX = 3;
public int litPrevX = 3;
public Double accPrevY;
public Double sndPrevY;
public Double litPrevY;
public Group accgroup;
public Group sndgroup;
public Group litgroup;
public Canvas creategraph(Canvas canvas, String type){
if (type.contains("acc")){accAlive = true; accCanvas = canvas; accgroup = new Group(); accGFXContext = accCanvas.getGraphicsContext2D(); return accCanvas;}
if (type.contains("snd")){sndAlive = true; sndCanvas = canvas; sndgroup = new Group(); sndGFXContext = sndCanvas.getGraphicsContext2D(); return sndCanvas;}
if (type.contains("lit")){litAlive = true; litCanvas = canvas; litgroup = new Group(); litGFXContext = litCanvas.getGraphicsContext2D(); return litCanvas;}
return null;
}
public void addData(String type, Double data){
if (type.contains("acc")){this.accval = data; draw("acc");}
if (type.contains("snd")){this.sndval = data; draw("snd");}
if (type.contains("lit")){this.litval = data; draw("lit");}
}
public void draw(String type){
GraphicsContext gc = null;
Double val = null;
Double prevVal = null;
int x = 0;
if (type.contains("acc")){gc = accGFXContext; x = accPrevX; val = accval; if(accPrevY == null){accPrevY = accval;} prevVal = accPrevY;}
if (type.contains("snd")){gc = sndGFXContext; x = sndPrevX; val = sndval; if(sndPrevY == null){sndPrevY = sndval;} prevVal = sndPrevY;}
if (type.contains("lit")){gc = litGFXContext; x = litPrevX; val = litval; if(litPrevY == null){litPrevY = litval;} prevVal = litPrevY;}
if (gc != null && val != null){
gc.setLineWidth(1);
gc.beginPath();
gc.setStroke(Color.GREEN);
gc.moveTo(x, prevVal);
x+=2;
gc.lineTo(x, val);
gc.stroke();
if (type.contains("acc")){accPrevY = val; accPrevX = x;}
if (type.contains("snd")){sndPrevY = val; sndPrevX = x;}
if (type.contains("lit")){litPrevY = val; litPrevX = x;}
}
}
}
Вот мой контроллер.
public class GUI implements Initializable{
private int currentval = 0;
public Graph graph;
Random rand;
@FXML
Canvas accCanvas;
@FXML
Canvas sndCanvas;
@FXML
Canvas litCanvas;
@Override
public void initialize(URL location, ResourceBundle resources) {
rand = new Random();
creategraph();
}
public void creategraph(){
graph = new Graph();
accCanvas = graph.creategraph(accCanvas, "acc");
sndCanvas = graph.creategraph(sndCanvas, "snd");
litCanvas = graph.creategraph(litCanvas, "lit");
startgraphing();
}
public void updatenumber(){
currentval = rand.nextInt(50) + 1;
}
public void startgraphing(){
Runnable timerRunnable = new Runnable() {
public void run() {
updatenumber();
System.out.println("Current Value: " + currentval);
graph.addData("acc", (double) currentval);
graph.addData("snd", (double) currentval);
graph.addData("lit", (double) currentval);
}
};
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(timerRunnable, 0, 50, TimeUnit.MILLISECONDS);
timerRunnable.run();
}
}
Не очень ищу раздаточные материалы. Просто ищу идеи о том, как двигаться вперед.