У меня проблема: при запущенной программе масштабирование окна графика не активно. При изменении размера окна диаграмма и другие элементы окна не масштабируются
Подскажите, что добавить, чтобы исправить проблему?
source:
Main. java
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
Button button = new Button(); //Создание кнопки
button.setText("Начать"); //Создание надписи на кнопке
button.setPrefSize(150,30); // Размер кнопки
button.setAlignment(Pos.CENTER); // Положение кнопки на экране
button.setTranslateY(75); //Перемещение кнопки по оси Y
button.setFont(Font.font("Arial", 20)); //Параметры шрифта и размер шрифта
Label label1 = new Label("Верзьера Аньези"); // Создание текста
label1.setPrefSize(580, 225); // Размер текста
label1.setLayoutX(100); // Положение текста в рамках Label по оси Х
label1.setLayoutY(100); // Положение текста в рамках Label по оси Y
label1.setAlignment(Pos.TOP_CENTER); // Положение текста на экране
label1.setFont(Font.font("Arial", 20)); // Параметры шрифта и размер шрифта
Label label2 = new Label("Введите диаметр а (Рек. 2):"); // Создание текста
label2.setPrefSize(580, 100); // Размер текста
label2.setLayoutX(100); // Положение текста в рамках Label по оси Х
label2.setLayoutY(100); // Положение текста в рамках Label по оси Y
label2.setTranslateY(-25); // Положение текста по оси Х на экране
label2.setTranslateX(40); // Положение текста по оси Y на экране
label2.setAlignment(Pos.TOP_LEFT); // Положение текста на экране
label2.setFont(Font.font("Arial", 12)); // Параметры шрифта и размер шрифта
Label label3 = new Label("Интервал осей (X/Y):"); // Создание текста
label3.setPrefSize(580, 100); // Размер текста
label3.setLayoutX(100); // Положение текста в рамках Label по оси Х
label3.setLayoutY(100); // Положение текста в рамках Label по оси Y
label3.setTranslateY(6); // Положение текста по оси Х на экране
label3.setTranslateX(30); // Положение текста по оси Y на экране
label3.setAlignment(Pos.TOP_LEFT); // Положение текста на экране
label3.setFont(Font.font("Arial", 12)); // Параметры шрифта и размер шрифта
TextField txtf = new TextField(); // Создание поля ввода
txtf.setAlignment(Pos.TOP_LEFT); // Положение поля ввода на экране
txtf.setTranslateY(-65); // Положение поля ввода по оси Х на экране
txtf.setTranslateX(60); // Положение поля ввода по оси Y на экране
txtf.setMaxWidth(75); // Максимальное количество значений
txtf.setFont(Font.font("Arial", 15)); // Параметры шрифта и размер шрифта
TextField txtxLow = new TextField(); // Создание поля ввода
txtxLow.setAlignment(Pos.TOP_LEFT); // Положение поля ввода на экране
txtxLow.setTranslateY(-35); // Положение поля ввода по оси Х на экране
txtxLow.setTranslateX(20); // Положение поля ввода по оси Y на экране
txtxLow.setMaxWidth(75); // Максимальное количество значений
txtxLow.setFont(Font.font("Arial", 15)); // Параметры шрифта и размер шрифта
TextField txtxHi = new TextField(); // Создание поля ввода
txtxHi.setAlignment(Pos.TOP_LEFT); // Положение поля ввода на экране
txtxHi.setTranslateY(-35); // Положение поля ввода по оси Х на экране
txtxHi.setTranslateX(100); // Положение поля ввода по оси Y на экране
txtxHi.setMaxWidth(75); // Максимальное количество значений
txtxHi.setFont(Font.font("Arial", 15)); // Параметры шрифта и размер шрифта
txtf.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue,
String newValue) { // Ограничение ввода значений, разрешены только цифры и знак -
if (!newValue.matches("|[-+]?|[-+]?\\d+\\.?|[-+]?\\d+\\.?\\d+")){
txtf.setText(oldValue);
}
}
});
txtxLow.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue,
String newValue) {
if (!newValue.matches("|[-+]?|[-+]?\\d+\\.?|[-+]?\\d+\\.?\\d+")){
txtxLow.setText(oldValue);
}
}
});
txtxHi.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue,
String newValue) {
if (!newValue.matches("|[-+]?|[-+]?\\d+\\.?|[-+]?\\d+\\.?\\d+")){
txtxHi.setText(oldValue);
}
}
});
button.setOnAction(new EventHandler<ActionEvent>() { // Проверка нажатия на кнопку
@Override
public void handle(ActionEvent event) { // Запуск второго экрана
if (txtf.getText().isEmpty()) {
JOptionPane.showMessageDialog(null, "Пожалуйста заполните поля для ввода!"); // Проверка на заполения поля ввода txtf
return;
}
if (txtxHi.getText().isEmpty()) {
JOptionPane.showMessageDialog(null, "Пожалуйста заполните поля для ввода!");
return;
}
if (txtxLow.getText().isEmpty()) {
JOptionPane.showMessageDialog(null, "Пожалуйста заполните поля для ввода!");
return;
}
int a = Integer.parseInt(txtf.getText());
double xLow = Double.parseDouble(txtxLow.getText());
double xHi = Double.parseDouble(txtxHi.getText());
double yLow = Double.parseDouble(txtxLow.getText()); // Считывание данных с полей ввода
double yHi = Double.parseDouble(txtxHi.getText());
double xMinGraph = Double.parseDouble(txtxLow.getText());
double xMaxGraph = Double.parseDouble(txtxHi.getText());
Axes axes = new Axes( // Запуск класса Axes
900, 900, // Размер второго экрана с графиком
xLow, xHi, 1, // Параметры осей Х
yLow, yHi, 1 // Парамтеры осей Y
);
Plot plot = new Plot( // Запуск класса Plot
x -> ( a * a * a) / (x * x + a * a), // Формула для расчета кривой
xMinGraph, xMaxGraph, 0.01, // Параметр начала и конца графика
axes // Вызов axes
);
StackPane layout = new StackPane( // Запуск экрана
plot // Вызов plot
);
layout.setPadding(new Insets(20));
layout.setStyle("-fx-background-color: rgb(255, 255, 255);");
Stage stage = new Stage(); // Параметры второго экрана : название, цвет фона и т.д
stage.setTitle("Верзьера Аньези");
stage.setScene(new Scene(layout, Color.rgb(255, 255, 255)));
stage.show(); // Вывод экрана
}
});
StackPane root = new StackPane();
root.getChildren().add(label1);
root.getChildren().add(label2);
root.getChildren().add(label3);
root.getChildren().add(button); // Вывод элементов на экран
root.getChildren().add(txtf);
root.getChildren().add(txtxLow);
root.getChildren().add(txtxHi);
Scene scene = new Scene(root, 350, 300); // Установка размера первого экрана
primaryStage.setTitle("Параметры");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Оси. java
public class Axes extends Pane {
private NumberAxis xAxis; // Создание насечек на оси х
private NumberAxis yAxis; // Создание насечек на оси у
public Axes(
int width, int height,
double xLow, double xHi, double xTickUnit, // Объявление переменных для отрисовки осей
double yLow, double yHi, double yTickUnit
) {
setMinSize(Pane.USE_COMPUTED_SIZE, Pane.USE_COMPUTED_SIZE);
setPrefSize(width, height);
setMaxSize(Pane.USE_COMPUTED_SIZE, Pane.USE_COMPUTED_SIZE); // Размер осей
xAxis = new NumberAxis(xLow, xHi, xTickUnit);
xAxis.setSide(Side.BOTTOM);
xAxis.setMinorTickVisible(false); // Расчет оси х
xAxis.setPrefWidth(width);
xAxis.setLayoutY(height / 2.0);
yAxis = new NumberAxis(yLow, yHi, yTickUnit);
yAxis.setSide(Side.LEFT);
yAxis.setMinorTickVisible(false); // Расчет оси у
yAxis.setPrefHeight(height);
yAxis.layoutXProperty().bind(
Bindings.subtract(
(width / 2) + 1,
yAxis.widthProperty()
)
);
///////////////////////////////////////////////Создание полярной сетки//////////////////////////////////////////////////
Circle circ1 = new Circle();
circ1.setFill(Color.rgb(255,255,255,0));
circ1.setStroke(Color.BLACK);
circ1.setCenterX(450);
circ1.setCenterY(450);
circ1.setRadius(65);
circ1.setOpacity(0.3);
Circle circ2 = new Circle();
circ2.setFill(Color.rgb(255,255,255,0));
circ2.setStroke(Color.BLACK);
circ2.setCenterX(450);
circ2.setCenterY(450);
circ2.setRadius(130);
circ2.setOpacity(0.3);
Circle circ3 = new Circle();
circ3.setFill(Color.rgb(255,255,255,0));
circ3.setStroke(Color.BLACK);
circ3.setCenterX(450);
circ3.setCenterY(450);
circ3.setRadius(195);
circ3.setOpacity(0.3);
Circle circ4 = new Circle();
circ4.setFill(Color.rgb(255,255,255,0));
circ4.setStroke(Color.BLACK);
circ4.setCenterX(450);
circ4.setCenterY(450);
circ4.setRadius(260);
circ4.setOpacity(0.3);
Line lin30 = new Line();
Text angle30 = new Text();
Text angle210 = new Text();
lin30.setStartX(800);
lin30.setStartY(300);
lin30.setEndX(100);
lin30.setEndY(600);
lin30.setOpacity(0.3);
angle30.setX(800);
angle30.setY(290);
angle30.setText("30°");
angle210.setX(100);
angle210.setY(590);
angle210.setText("210°");
angle30.setOpacity(0.3);
angle210.setOpacity(0.3);
Line lin30Z = new Line();
Text angle30Z = new Text();
Text angle330 = new Text();
lin30Z.setStartX(100);
lin30Z.setStartY(300);
lin30Z.setEndX(800);
lin30Z.setEndY(600);
lin30Z.setOpacity(0.3);
angle30Z.setX(100);
angle30Z.setY(290);
angle30Z.setText("150°");
angle330.setX(800);
angle330.setY(590);
angle330.setText("330°");
angle30Z.setOpacity(0.3);
angle330.setOpacity(0.3);
Line lin45 = new Line();
Text angle45 = new Text();
Text angle225 = new Text();
lin45.setStartX(150);
lin45.setStartY(150);
lin45.setEndX(750);
lin45.setEndY(750);
lin45.setOpacity(0.3);
angle45.setX(150);
angle45.setY(140);
angle45.setText("135°");
angle225.setX(750);
angle225.setY(740);
angle225.setText("315°");
angle45.setOpacity(0.3);
angle225.setOpacity(0.3);
Line lin45Z = new Line();
Text angle45Z = new Text();
Text angle315 = new Text();
lin45Z.setStartX(150);
lin45Z.setStartY(750);
lin45Z.setEndX(750);
lin45Z.setEndY(150);
lin45Z.setOpacity(0.3);
angle45Z.setX(150);
angle45Z.setY(730);
angle45Z.setText("225°");
angle315.setX(750);
angle315.setY(140);
angle315.setText("45°");
angle45Z.setOpacity(0.3);
angle315.setOpacity(0.3);
Line lin60 = new Line();
Text angle60 = new Text();
Text angle240 = new Text();
lin60.setStartX(570);
lin60.setStartY(150);
lin60.setEndX(320);
lin60.setEndY(780);
lin60.setOpacity(0.3);
angle60.setX(570);
angle60.setY(140);
angle60.setText("60°");
angle240.setX(300);
angle240.setY(770);
angle240.setText("240°");
angle60.setOpacity(0.3);
angle240.setOpacity(0.3);
Line lin60Z = new Line();
Text angle60Z = new Text();
Text angle300 = new Text();
lin60Z.setStartX(330);
lin60Z.setStartY(150);
lin60Z.setEndX(580);
lin60Z.setEndY(780);
lin60Z.setOpacity(0.3);
angle60Z.setX(330);
angle60Z.setY(140);
angle60Z.setText("120°");
angle300.setX(580);
angle300.setY(770);
angle300.setText("300°");
angle60Z.setOpacity(0.3);
angle300.setOpacity(0.3);
CheckBox check = new CheckBox("Отобразить полярную сетку"); //CheckBox для отображение сетки
check.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
// TODO Auto-generated method stub
if(newValue){
getChildren().addAll(circ1,circ2,circ3,circ4,lin30,lin30Z,lin45,lin45Z,lin60,lin60Z,angle30,
angle30Z,angle45,angle45Z,angle60,angle60Z,angle210,angle225,angle240,angle300,angle315,angle330);
}else{
getChildren().removeAll(circ1,circ2,circ3,circ4,lin30,lin30Z,lin45,lin45Z,lin60,lin60Z,angle30,
angle30Z, angle45,angle45Z,angle60,angle60Z,angle210,angle225,angle240,angle300,angle315,angle330);
}
}
});
/////////////////////////////////////////////////Конец отображения//////////////////////////////////////////////////////
// Подпись осей
Text txtY = new Text();
txtY.setX(450);
txtY.setY(yLow);
txtY.setText("Y");
Text txtX = new Text();
txtX.setX(905);
txtX.setY(450);
txtX.setText("X");
getChildren().setAll(xAxis, yAxis, txtY, txtX,check); // Отображение элементов на экране
}
public NumberAxis getXAxis() {
return xAxis;
}
public NumberAxis getYAxis() {
return yAxis;
}
}
Участок. java
public class Plot extends Pane {
public Rectangle rect = new Rectangle(100,450,10,10); // Создание прямоугольника
public PathTransition pathTransition = new PathTransition(); // Параметр анимации
Polyline pol = new Polyline(); // Создание пути анимации
public Plot(
Function<Double, Double> f,
double xMin, double xMax, double xInc, //Объявление переменных для постройки кривой
Axes axes
) {
Path path = new Path();
path.setStroke(Color.RED.deriveColor(0, 1, 1, 0.6)); // Создание кривой
path.setStrokeWidth(2); //Толщина кривой
double x = xMin;
double y = f.apply(x); // Создание переменных для отрисовки кривой
pol.getPoints().clear(); // Отчистка анимации
path.getElements().add(
new MoveTo(
mapX(x, axes), mapY(y, axes) // Построение трактории кривой
)
);
x += xInc;
while (x < xMax) {
y = f.apply(x);
path.getElements().add(
new LineTo(
mapX(x, axes), mapY(y, axes) // Отрисовка кривой
)
);
img