我希望每次我按下按钮来“更新”具有新统计信息的折线图。我可以通过启动应用程序来完美地运行代码(我希望它多次运行?),但是我确实相信我需要每次创建一个新的根,而不是一个场景,或者多次运行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();
}
}
正如@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()));
}
}
}