Самодельный 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();
}

}

Не очень ищу раздаточные материалы. Просто ищу идеи о том, как двигаться вперед.

0 ответов

Другие вопросы по тегам