Проблема масштабирования графического окна JavaFx - PullRequest
1 голос
/ 04 августа 2020

У меня проблема: при запущенной программе масштабирование окна графика не активно. При изменении размера окна диаграмма и другие элементы окна не масштабируются

Подскажите, что добавить, чтобы исправить проблему?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...