JavaFX - обновление графика - PullRequest
       9

JavaFX - обновление графика

0 голосов
/ 22 февраля 2020

У меня есть два класса ViewTaskTest и ControllerTaskTest. В представлении есть две кнопки: одна для создания случайной точки, а другая для запуска контроллера. После запуска контроллер разместит 10 случайных точек на графике внутри представления. Но точки видны только в конце. Я хочу видеть точки, размещаемые одна за другой. Я знаю, что мне нужно как-то использовать Task-функции, и я изо всех сил пытаюсь понять эту концепцию.

Это ViewTaskTest-класс:

package View;

import Controller.ControllerTaskTest;
import javafx.concurrent.Task;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.chart.Axis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.ScatterChart;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ViewTaskTest{

    ScatterChart<Number, Number> scatterChart;
    XYChart.Series<Number, Number> series = new XYChart.Series<Number, Number>();  
    Axis<Number> xAxis = new NumberAxis(0, 10, 2); ;
    Axis<Number> yAxis = new NumberAxis(0, 10, 2); ; 
    Button buttonAddRandomPoint = new Button("Add random point");
    Button buttonStartControllerTest = new Button("Start controller");
    private final int MAIN_WINDOW_HEIGHT = 800;
    private final int MAIN_WINDOW_WIDTH = 800;
    ControllerTaskTest controller;

    public ViewTaskTest() {

    }

    public void setController(ControllerTaskTest controller) {
        this.controller = controller;
    }

    public void fillStage(Stage stage)  {

        stage.setTitle("QuickPID");
        stage.setMinHeight(MAIN_WINDOW_HEIGHT);
        stage.setMinWidth(MAIN_WINDOW_WIDTH);
        stage.setMaxHeight(MAIN_WINDOW_HEIGHT);
        stage.setMaxWidth(MAIN_WINDOW_WIDTH);
        Scene sceneOne = new Scene(new Group());
        scatterChart = new ScatterChart<Number, Number>(xAxis, yAxis);
        scatterChart.getData().add(series);

        // add a random point 
        buttonAddRandomPoint.setOnAction(e -> {
            Double x = new Double(0.0);
            Double y = new Double(0.0);
            try{
                x = Math.random() * 10;
                y = Math.random() * 10;
                series.getData().add(new XYChart.Data<Number, Number>(x, y)); 
            } catch (Exception ex) {
                System.out.println("Error");
            }

        });

        buttonStartControllerTest.setOnAction(e -> {
            controller.startAddingPoints();
        });

        VBox vboxButtons = new VBox(5);
        HBox hboxMain = new HBox(5);
        vboxButtons.getChildren().addAll(buttonAddRandomPoint, buttonStartControllerTest);
        vboxButtons.setAlignment(Pos.BOTTOM_LEFT);
        vboxButtons.setPadding(new Insets(10));
        hboxMain.getChildren().addAll(scatterChart, vboxButtons);
        sceneOne.setRoot(hboxMain);
        stage.setScene(sceneOne);
    }

    public void addRandomPointFromController(Double x, Double y) {
        System.out.println("starting view task");
        Task<Integer> task = new Task<Integer>() {
            @Override protected Integer call() throws Exception {
                series.getData().add(new XYChart.Data<Number, Number>(x, y));
                return 0;
            }
        };  

        task.run();
    }
}

Вот ControllerTestTask-Class :

package Controller;

import View.ViewTaskTest;
import javafx.concurrent.Task;

public class ControllerTaskTest {

    ViewTaskTest view;

    public ControllerTaskTest() {
    }

    public void setView(ViewTaskTest view) {
        this.view = view;
    }

    public void startAddingPoints() {
        System.out.println("starting controller task");
        Task<Integer> task = new Task<Integer>() {
            @Override protected Integer call() throws Exception {
                for(int i = 0; i < 10; i++) {
                    Double x = Math.random() * 10;
                    Double y = Math.random() * 10;
                    view.addRandomPointFromController(x, y);
                    System.out.println("Adding point x = " + x + " and y = " + y);
                    Thread.sleep(100);
                }
                return 0;
            }
        };  
        task.run();
    }
}

Вот основной класс:

package Test;

import Controller.ControllerTaskTest;
import View.ViewTaskTest;
import javafx.application.Application;
import javafx.stage.Stage;

public class Test extends Application{

    private ViewTaskTest view= new ViewTaskTest();
    private ControllerTaskTest controller = new ControllerTaskTest();

    public static void main(String[] args) {
        launch();
    }

    @Override
    public void start(Stage stage) throws Exception {
        view.setController(controller);
        controller.setView(view);
        stage.show();
        view.fillStage(stage);
    }
}

Некоторые, пожалуйста, объясните мне, что я делаю неправильно. Я экспериментирую с Thread-функциями, но не могу решить свою проблему.

...