Java 制作每秒从上到下移动绘制点的折线图

Java 制作每秒从上到下移动绘制点的折线图,java,charts,javafx,linechart,Java,Charts,Javafx,Linechart,我有一个折线图,其中1600个随机点被添加到序列中 加载数据后,每隔5秒,已绘制的点应将其y轴减少一点 这里我的问题是我不知道串联的轴值(x轴/y轴值),因为它是随机数据 假设我知道这些价值观;但对于处理1600个值来说,这很耗时 更新: private void prepareTimeLine() { timer = new AnimationTimer() { @Override public void handle(long l) { addDataTo

我有一个折线图,其中1600个随机点被添加到序列中

加载数据后,每隔5秒,已绘制的点应将其y轴减少一点

这里我的问题是我不知道串联的轴值(x轴/y轴值),因为它是随机数据

假设我知道这些价值观;但对于处理1600个值来说,这很耗时

更新:

 private void prepareTimeLine() {
timer = new AnimationTimer() {

    @Override
    public void handle(long l) {
        addDataToSeries();

    }
};

}

private void startTimer() {
timer.start();
}

private void stopTimer() {
timer.stop();
System.out.println("  " + lineChart.getData().size());
System.out.println(" " + series.getData().size());
if (lineChart.getData().size() > 0) {
    series.getData().remove(0, series.getData().size());
}
}

private void prepareRffTimeLine() {
rffTimer = new AnimationTimer() {

    @Override
    public void handle(long l) {
        rffSeries.getData().remove(0, rffSeries.getData().size());
        addRffDataToSeries();
    }
};

}

private void startRffTimer() {
rffTimer.start();
}

private void stopRffTimer() {
rffTimer.stop();
if (rffLineChart.getData().size() > 0) {
    rffSeries.getData().remove(0, rffSeries.getData().size());
}
}

public void addDataToSeries() {

double x = 0;
double y = 0;
int i = 1;

seriesXData.clear();
seriesYData.clear();
for (i = 1; i <= 1596; i++) {
    x = Math.random() * i + 1;
    y = (Math.random() * ((-100) - (-130))) + -130;
    seriesXData.add(new XYChart.Data(x, y));
    seriesYData.add(new XYChart.Data(x, y));
}

seriesXData.add(new XYChart.Data(300.0, -60.0));
seriesXData.add(new XYChart.Data(600.0, -50.0));
seriesXData.add(new XYChart.Data(900.0, -30.0));
seriesXData.add(new XYChart.Data(1300.0, -10.0));

seriesYData.add(new XYChart.Data(300.0, -60.0));
seriesYData.add(new XYChart.Data(600.0, -50.0));
seriesYData.add(new XYChart.Data(900.0, -30.0));
seriesYData.add(new XYChart.Data(1300.0, -10.0));

Collections.sort(seriesXData, new ArrangeXData());
Collections.sort(seriesYData, new ArrangeYData());
series.getData().addAll(seriesXData);

if (series.getData().size() > 1600) {
    series.getData().remove(0, 1600);
}


}

public void addRffDataToSeries() {

Comparator<XYChart.Data<Double, Double>> c = new Comparator<XYChart.Data<Double, Double>>() {
    @Override
    public int compare(XYChart.Data<Double, Double> o1, XYChart.Data<Double, Double> o2) {
        return o1.getYValue().compareTo(o2.getYValue());
    }
};

int index = Collections.binarySearch(seriesYData, new XYChart.Data<Double, Double>(null, Double.parseDouble(String.valueOf(Line.y))), c);

int insertion_point = -(index + 1);
if (seriesYData.size() <= 0) {
    return;
}
List<XYChart.Data<Double, Double>> res = seriesYData.subList(insertion_point, seriesYData.size());

for (int ind = 0; ind < res.size(); ind++) {
    for (int pos = Bounds.x; pos > Bounds.y; pos--) {
        rffSeries.getData().add(new XYChart.Data(res.get(ind).getXValue(), pos));
    }

}


}
private void prepareTimeLine(){
计时器=新建动画计时器(){
@凌驾
公共无效句柄(长l){
addDataToSeries();
}
};
}
私有void startTimer(){
timer.start();
}
私有void stopTimer(){
timer.stop();
System.out.println(“+lineChart.getData().size());
System.out.println(“+series.getData().size());
如果(lineChart.getData().size()>0){
series.getData().remove(0,series.getData().size());
}
}
私有无效制备程序ftimeline(){
rffTimer=newanimationtimer(){
@凌驾
公共无效句柄(长l){
删除(0,rffSeries.getData().size());
addRffDataToSeries();
}
};
}
私有void startRffTimer(){
rffTimer.start();
}
私有void stopftimer(){
rffTimer.stop();
如果(rffLineChart.getData().size()>0){
删除(0,rffSeries.getData().size());
}
}
public void addDataToSeries(){
双x=0;
双y=0;
int i=1;
seriesXData.clear();
seriesYData.clear();
对于(i=1;i 1600){
series.getData().remove(0,1600);
}
}
public void addRffDataToSeries(){
比较器c=新比较器(){
@凌驾
公共整数比较(XYChart.Data o1、XYChart.Data o2){
返回o1.getYValue().compareTo(o2.getYValue());
}
};
int index=Collections.binarySearch(seriesYData,new XYChart.Data(null,Double.parseDouble(String.valueOf(Line.y))),c);
int插入点=-(索引+1);
if(seriesYData.size()Bounds.y;pos--){
添加(新的XYChart.Data(res.get(ind.getXValue(),pos));
}
}
}
请通过这个链接

我也问了同样类型的问题


在折线图2中,折线图1中的峰值应以这样的方式显示,即这些值应从上到下连续绘制。

您的问题很模糊。请把密码寄出去

这应该是有用的

下面我们不知道您正在使用JavaFx

我所能做的最好的建议是,假设你的x坐标是整数且为0-1599,你将你的点存储为
int[]
,数组索引作为x值,每个int值本身作为y值。这允许您在一次操作中从x值中获取y值,但不允许在不检查整个数组的情况下从y中获取x值

Random rng = new Random();
int[] points = new int[1600];
for(int i = 0; i < 1600; i++) {
    points[i] = rng.nextInt(1600); // Between 0 and 1600
}
Random rng=new Random();
int[]点=新int[1600];
对于(int i=0;i<1600;i++){
点[i]=rng.nextInt(1600);//介于0和1600之间
}

您确定要同时显示所有1600个值吗?@Uluk Biy是的,我将从实时设备获取1600个值。您需要指定:您是否使用第三方库或其他工具将图形渲染为图像?@Scruffy,他使用的是JavaFX,其中有一个名为LineChart的组件。@UlukBiy正在查看它。谢谢