JavaFx:通过单击按钮更新数据

问题描述 投票:0回答:1

我希望每次我按下按钮来“更新”具有新统计信息的折线图。我可以通过启动应用程序来完美地运行代码(我希望它多次运行?),但是我确实相信我需要每次创建一个新的根,而不是一个场景,或者多次运行lauch部分(这是我做不到的),这可能吗?

public class Plotting extends Application{
@Override
public void start(Stage primaryStage) throws Exception{
    init(primaryStage); 

} 

public static void plot(){
    launch();        
}

public void init(Stage primaryStage) throws Exception{
    HBox root = new HBox();
    Scene scene = new Scene(root,850,630);
    CategoryAxis xAxis = new CategoryAxis();
    xAxis.setLabel("Years");
    NumberAxis yAxis = new NumberAxis();
    yAxis.setLabel("Value");
    CategoryAxis xGDPAxis = new CategoryAxis();
    xAxis.setLabel("Years");
    NumberAxis yGDPAxis = new NumberAxis();
    yAxis.setLabel("Value");

    LineChart<String,Number> linechart = new LineChart<String,Number>(xAxis,yAxis);
    linechart.setTitle("Oil Consumption");
    LineChart<String,Number> linechartGDP = new LineChart<String,Number>(xGDPAxis,yGDPAxis);
    linechartGDP.setTitle("GDP");

    XYChart.Series<String,Number> data = new XYChart.Series<>();
    XYChart.Series<String,Number> dataGDP = new XYChart.Series<>();

    for(int j=1; j<Database.choosenData.size(); j+=2){
        double k = Double.parseDouble(Database.choosenData.get((j)));
        data.getData().add(new XYChart.Data(Database.choosenData.get(j-1).substring(1, 5),k));
    }
     for(int j=1; j<Database.choosenDataGDP.size(); j+=2){
        double k = Double.parseDouble(Database.choosenDataGDP.get((j)));
        dataGDP.getData().add(new XYChart.Data(Database.choosenDataGDP.get(j-1).substring(1, 5),k));
    }

     for(int j=1; j<OkHTTPTest.clearData.size(); j+=2){
        double k = Double.parseDouble(OkHTTPTest.clearData.get((j)));
        data.getData().add(new XYChart.Data(OkHTTPTest.clearData.get(j-1).substring(1, 5),k));
    }
     for(int j=1; j<OkHTTPTest.clearDataGDP.size(); j+=2){
        double k = Double.parseDouble(OkHTTPTest.clearDataGDP.get((j)));
        dataGDP.getData().add(new XYChart.Data(OkHTTPTest.clearDataGDP.get(j-1).substring(1, 5),k));
    }

    linechart.getData().add(data);
    linechartGDP.getData().add(dataGDP);
    root.getChildren().add(linechart);
    root.getChildren().add(linechartGDP);

    primaryStage.setTitle("Plotting Data");
    primaryStage.setScene(scene);
    primaryStage.show();
    primaryStage.close();

}
}
javafx linechart
1个回答
0
投票

正如@James_D所说,这个问题有点不清楚。如果要更新图表,您要做的就是更新图表的“数据”。

下面是您提供的简短示例。只需处理更新/添加/删除图表的“数据”。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Pair;

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;

public class Plotting extends Application {
    SecureRandom rnd = new SecureRandom();

    @Override
    public void start(Stage primaryStage) throws Exception {
        init(primaryStage);
    }

    public static void plot() {
        launch();
    }

    public void init(Stage primaryStage) throws Exception {

        List<Pair<String,Integer>> choosenData = new ArrayList<>();
        List<Pair<String,Integer>> gdpData = new ArrayList<>();
        HBox row = new HBox();
        CategoryAxis xAxis = new CategoryAxis();
        xAxis.setLabel("Years");
        NumberAxis yAxis = new NumberAxis();
        yAxis.setLabel("Value");
        CategoryAxis xGDPAxis = new CategoryAxis();
        xGDPAxis.setLabel("Years");
        NumberAxis yGDPAxis = new NumberAxis();
        yGDPAxis.setLabel("Value");

        LineChart<String, Number> linechart = new LineChart<String, Number>(xAxis, yAxis);
        linechart.setTitle("Oil Consumption");
        LineChart<String, Number> linechartGDP = new LineChart<String, Number>(xGDPAxis, yGDPAxis);
        linechartGDP.setTitle("GDP");

        XYChart.Series<String, Number> data = new XYChart.Series<>();
        XYChart.Series<String, Number> dataGDP = new XYChart.Series<>();

        updateData(choosenData,gdpData,data,dataGDP);

        linechart.getData().add(data);
        linechartGDP.getData().add(dataGDP);
        row.getChildren().add(linechart);
        row.getChildren().add(linechartGDP);

        Button update = new Button("Update");
        update.setOnAction(e->updateData(choosenData,gdpData,data,dataGDP));
        VBox root = new VBox(update,row);
        root.setSpacing(10);
        root.setPadding(new Insets(10));
        Scene scene = new Scene(root, 850, 630);
        primaryStage.setTitle("Plotting Data");
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    private void updateData(List<Pair<String, Integer>> choosenData, List<Pair<String, Integer>> gdpData, XYChart.Series<String, Number> data, XYChart.Series<String, Number> dataGDP) {
        choosenData.clear();
        gdpData.clear();
        IntStream.rangeClosed(2010,2020).forEach(y->{
            choosenData.add(new Pair<>(y+"",rnd.nextInt(1000)+500));
            gdpData.add(new Pair<>(y+"",rnd.nextInt(100)+50));
        });
        data.getData().clear();
        dataGDP.getData().clear();
        for (int j = 0; j < choosenData.size(); j ++) {
            data.getData().add(new XYChart.Data(choosenData.get(j).getKey(),choosenData.get(j).getValue()));
        }
        for (int j = 0; j < gdpData.size(); j ++) {
            dataGDP.getData().add(new XYChart.Data(gdpData.get(j).getKey(),gdpData.get(j).getValue()));
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.