首页 > 解决方案 > Javafx中的时间测量图表

问题描述

我想做一个图表,显示特定方法的执行时间,该方法执行多次,执行次数是随机的,这意味着时间并不总是相同的。我的问题是如何将我的数组“样本”中的数据整合到图表中,以便正确显示数据。现在它没有在图表中显示任何内容,我只能看到没有任何内容的网格。我做错了什么,它不起作用?这是我的代码:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        // TODO Auto-generated method stub
        StackPane pane = new StackPane();
        Scene scene = new Scene(pane, 1000, 600);
        Button start = new Button();
        int n = (int) Math.floor(Math.random() * 100);
        start.setText("Start");
        start.setStyle("-fx-font-size: 30;");
        start.setOnAction(e->{
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            long[] sample = run(n);
            start.setVisible(false);
            analyse(sample, pane);
        });
        pane.getChildren().add(start);
        primaryStage.setTitle("Time statistics");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void analyse(long[] sample, StackPane pane) {
        // TODO Auto-generated method stub
        long max = sample[0];
        for (int i = 0; i < sample.length; ++i) {
            if (sample[i] > max) {
                max = sample[i];
            }
        }

        //Create Chart
        //Create the X-Axis
        NumberAxis xAxis = new NumberAxis();
        xAxis.setLabel("Run number");
        xAxis.setLowerBound(0);
        xAxis.setUpperBound(100);
        xAxis.setTickUnit(1);

        //Create the Y-Axis
        NumberAxis yAxis = new NumberAxis();
        yAxis.setLabel("Time");

        //Create Line Chart
        LineChart<Number, Number> chart = new LineChart<Number, Number>(xAxis, yAxis);
        chart.setTitle("Time measurement");

        //Set the data for the chart
        ObservableList<XYChart.Series<Number,Number>> chartData = FXCollections.<XYChart.Series<Number, Number>>observableArrayList();
        chart.setData(chartData);

        //Set properties of the StackPane
        pane.setStyle("-fx-padding: 10;" +
                "-fx-border-style: solid inside;" +
                "-fx-border-width: 2;" +
                "-fx-border-insets: 5;" +
                "-fx-border-radius: 5;" +
                "-fx-border-color: blue;");

        pane.getChildren().add(chart);
    }

    private long[] run(int n) {
        // TODO Auto-generated method stub
        long[] delta = new long[n];
        while (n > 0) {
            long startTime = System.nanoTime();
            execute();
            delta[delta.length - n] = System.nanoTime() - startTime;
            --n;
        }
        return delta;
    }

    /**
     * Output of a random number between 0 and 100
     */
    private void execute() {
        // TODO Auto-generated method stub
        int n = (int) Math.floor(Math.random() * 100);
        int count = 0;
        while (n != 0) {
            ++count;
            --n;
        }
        System.out.println("Random number:");
        System.out.println(count);
    }

}

标签: javajavafxchartsdata-analysismeasurement

解决方案


推荐阅读