Построения графика в JavaFX

Как построить график функцию из класса Model, чтобы соответствовать стилю MVC

Класс Controller

package sample;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;

public class Controller extends View  {

    @FXML
    private TextField a;
    @FXML
    private TextField b;
    @FXML
    private TextField c;
    @FXML
    private TextField d;
    private Model model = new Model();
    @FXML
    public void solve() throws Exception {
        this.go();
    }
    private void go() {
        model.a(Double.valueOf((a.getText())));
        model.b(Double.valueOf((b.getText())));
        model.c(Double.valueOf((c.getText())));
        model.d(Double.valueOf((d.getText())));
        model.go();
    }
}

  

Класс Model

package sample;
public class Model {

    private double a;
    private double b;
    private double c;
    private double d;

    private double y;

    void a(Double s) {a = s;}
    void b(Double s) {b = s;}
    void c(Double s) {c = s;}
    void d(Double s) {d = s;}

    void go() {
        y=(a*a)*b+c/d;
    }

}

Класс Main

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 1000, 675));
        primaryStage.show();
    }


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

Класс View

package sample;

import javafx.fxml.FXML;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.XYChart;

public class View {

}

Файл fxml


<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.chart.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <Pane prefHeight="463.0" prefWidth="869.0">
         <children>
            <TextField fx:id="a" layoutX="57.0" layoutY="51.0" />
            <TextField fx:id="b" layoutX="57.0" layoutY="103.0" />
            <TextField fx:id="c" layoutX="57.0" layoutY="150.0" />
            <TextField fx:id="d" layoutX="57.0" layoutY="200.0" />
            <LineChart fx:id="lineChart" layoutX="343.0" layoutY="25.0">
              <xAxis>
                <CategoryAxis side="BOTTOM" />
              </xAxis>
              <yAxis>
                <NumberAxis side="LEFT" />
              </yAxis>
            </LineChart>
            <Label layoutX="14.0" layoutY="55.0" text="a" />
            <Label layoutX="14.0" layoutY="107.0" text="b" />
            <Label layoutX="14.0" layoutY="154.0" text="c" />
            <Label layoutX="14.0" layoutY="204.0" text="d" />
            <Button layoutX="79.0" layoutY="303.0" mnemonicParsing="false" onAction="#solve" text="Build" />
         </children>
      </Pane>
   </children>
   <columnConstraints>
      <ColumnConstraints />
   </columnConstraints>
   <rowConstraints>
      <RowConstraints />
   </rowConstraints>
</GridPane>

Ответы (1 шт):

Автор решения: Perfect Voyage

Добавьте в контроллере простой Pane, и так же пропишите его в файле fxml

@FXML
private Pane pane;



private void go() {
        model.a(Double.valueOf((a.getText())));
        model.b(Double.valueOf((b.getText())));
        model.c(Double.valueOf((c.getText())));
        model.d(Double.valueOf((d.getText())));
        model.go(pane);  // upd!
    }

Метод go в классе Model, примет эту панель на которой будет рисовать свой график

  void go(Pane pane){

     y=(a*a)*b+c/d;
     
     // Реализация вашего графика
     // Код ниже приведен для примера
     // и взят отсюда https://betacode.net/11107/javafx-barchart-stackedbarchart

     CategoryAxis xAxis = new CategoryAxis();
     xAxis.setLabel("Programming Language");

     NumberAxis yAxis = new NumberAxis();

     yAxis.setLabel("Percent");

     // Create a BarChart
     BarChart<Number, String> barChart = new BarChart<Number, String>(yAxis, xAxis);

     // Series 1 - Data of 2014
     XYChart.Series<Number, String> dataSeries1 = new XYChart.Series<Number, String>();
     dataSeries1.setName("2014");

     dataSeries1.getData().add(new XYChart.Data<Number, String>(20.973, "Java"));
     dataSeries1.getData().add(new XYChart.Data<Number, String>(4.429, "C#"));
     dataSeries1.getData().add(new XYChart.Data<Number, String>(2.792, "PHP"));

 
     // Add Series to BarChart.
     barChart.getData().add(dataSeries1);
     
     barChart.setTitle("Some Programming Languages");


     // Добавление вашего графика
     // на переданную панель


     pane.getChildren().clear();       // Если вызов происходит не в первый раз

     pane.getChildren().add(barChart);

}

Учитывая ваши переменные, и неизвестный характер графика я вам скинул простой пример, взятый с общего ресурса. На основе этой концепции можете сделать свою логику.

→ Ссылка