Построения графика в 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);
}
Учитывая ваши переменные, и неизвестный характер графика я вам скинул простой пример, взятый с общего ресурса. На основе этой концепции можете сделать свою логику.