JavaFX: изменение размеров панелей при изменении размера окна - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь создать простой Java-проект, который содержит 6 панелей (добавлен в GridPane Layout как родительский).Я должен был установить размер окна в начале, и мне удалось разделить их равномерно, ссылаясь на ширину и высоту корневого макета.

pane.setMinSize(root.getWidth()/3, root.getHeight()/2);

Но я хочу, чтобы они меняли размер при изменении размераокно (с помощью мыши, теперь они получают фиксированный размер).

Итак, мой вопрос, как я могу сделать это в JavaFX?Как сделать так, чтобы элементы растягивались и заполняли размер макета / части макета, а затем изменяли размер при изменении размера окна?

Вот мой код:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;


public class Main6 extends Application {

@Override
public void start(Stage primaryStage) throws Exception {

    GridPane root = new GridPane();
    Scene scene = new Scene(root, 900, 600);

    Pane pane1 = new Pane();
    pane1.setBackground(new Background(new BackgroundFill(Color.GREEN, CornerRadii.EMPTY, Insets.EMPTY)));
    pane1.setMinSize(root.getWidth()/3, root.getHeight()/2);

    Pane pane2 = new Pane();
    pane2.setBackground(new Background(new BackgroundFill(Color.WHITE, CornerRadii.EMPTY, Insets.EMPTY)));
    pane2.setMinSize(root.getWidth()/3, root.getHeight()/2);

    Pane pane3 = new Pane();
    pane3.setBackground(new Background(new BackgroundFill(Color.GREY, CornerRadii.EMPTY, Insets.EMPTY)));
    pane3.setMinSize(root.getWidth()/3, root.getHeight()/2);

    Pane pane4 = new Pane();
    pane4.setBackground(new Background(new BackgroundFill(Color.BLUE, CornerRadii.EMPTY, Insets.EMPTY)));
    pane4.setMinSize(root.getWidth()/3, root.getHeight()/2);

    Pane pane5 = new Pane();
    pane5.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
    pane5.setMinSize(root.getWidth()/3, root.getHeight()/2);

    Pane pane6 = new Pane();
    pane6.setBackground(new Background(new BackgroundFill(Color.YELLOW, CornerRadii.EMPTY, Insets.EMPTY)));
    pane6.setMinSize(root.getWidth()/3, root.getHeight()/2);

    root.getChildren().addAll(pane1, pane2, pane3, pane4, pane5, pane6);
    GridPane.setRowIndex(pane1, 0);
    GridPane.setColumnIndex(pane1, 0);
    GridPane.setRowIndex(pane2, 0);
    GridPane.setColumnIndex(pane2, 1);
    GridPane.setRowIndex(pane3, 0);
    GridPane.setColumnIndex(pane3, 2);
    GridPane.setRowIndex(pane4, 1);
    GridPane.setColumnIndex(pane4, 0);
    GridPane.setRowIndex(pane5, 1);
    GridPane.setColumnIndex(pane5, 1);
    GridPane.setRowIndex(pane6, 1);
    GridPane.setColumnIndex(pane6, 2);

    primaryStage.setTitle("Learning JavaFX");
    primaryStage.setScene(scene);
    primaryStage.show();
}

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

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Используйте ColumnConstraints и RowConstraints для достижения желаемого поведения при изменении размера:

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Main6 extends Application {

    private static final int ROWS = 2, COLS = 3;

    private static final Color[][] colors = new Color[][] {
            {Color.GREEN, Color.WHITE, Color.GRAY},
            {Color.BLUE, Color.RED, Color.YELLOW}
    };

    @Override
    public void start(Stage primaryStage) throws Exception {

        GridPane root = new GridPane();
        root.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

        //add panels 
        for(int row = 0; row < ROWS; row++){
            for(int col = 0; col < COLS; col++){
                root.getChildren().add( getPane(row, col));
            }
        }

        //Construct column constraints to resize horizontaly
        ObservableList<ColumnConstraints> colCconstraints = root.getColumnConstraints();
        colCconstraints.clear();
        for(int col = 0; col < COLS; col++){
             ColumnConstraints c = new ColumnConstraints();
             c.setHalignment(HPos.CENTER);
             c.setHgrow(Priority.ALWAYS);
             colCconstraints.add(c);
        }

        //Construct row constraints to resize vertically
        ObservableList<RowConstraints> rowCconstraints = root.getRowConstraints();
        rowCconstraints.clear();
        for(int row = 0; row < ROWS; row++){
             RowConstraints c = new RowConstraints();
             c.setValignment(VPos.CENTER);
             c.setVgrow(Priority.ALWAYS);
             rowCconstraints.add(c);
        }

        Scene scene = new Scene(root);
        primaryStage.setTitle("Learning JavaFX");
        primaryStage.setScene(scene);
        primaryStage.sizeToScene();
        primaryStage.show();
    }

    /**
     *
     */
    private Pane getPane(int row, int col) {

        Pane pane = new Pane();
        pane.setBackground(new Background(new BackgroundFill(colors[row][col], CornerRadii.EMPTY, Insets.EMPTY)));
        pane.setPrefSize(300, 300);
        GridPane.setRowIndex(pane, row);
        GridPane.setColumnIndex(pane, col);

        return pane;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
0 голосов
/ 12 декабря 2018

Хорошо, я нашел частично решение.Я добавил к своему коду:

    ColumnConstraints column1 = new ColumnConstraints();
    column1.setPercentWidth(33.333333);
    ColumnConstraints column2 = new ColumnConstraints();
    column2.setPercentWidth(33.333333);
    ColumnConstraints column3 = new ColumnConstraints();
    column3.setPercentWidth(33.333333);
    root.getColumnConstraints().addAll(column1, column2, column3);

    RowConstraints row1 = new RowConstraints();
    row1.setPercentHeight(50);
    RowConstraints row2 = new RowConstraints();
    row2.setPercentHeight(50);
    root.getRowConstraints().addAll(row1, row2);

и удалил все строки, задающие размер панелей, и это позволило изменить размер содержимого.

НО

, когда я задаю процентную ширину для (100/3) вместо 33,3333, это оставляет странное пустое пространство с правой стороны окна.Может кто-нибудь объяснить мне, почему это происходит?

Взгляните:

enter image description here

...