Как мне создать JavaFX BorderPane без центра? - PullRequest
0 голосов
/ 10 декабря 2018

Я хотел бы создать макет BorderPane в JavaFX без центральной панели.

Код, который я написал до сих пор, реализует только левую и правую границы и находится ниже:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class GUI_Practice extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        String blackBorder = "-fx-border-style: solid; -fx-border-width: 1; -fx-border-color: black";

        /* Left column */
        Button save = new Button("Save");
        Button del = new Button("Delete");
        HBox settings = new HBox(save, del);
        VBox leftCol = new VBox(settings);
        leftCol.setStyle(blackBorder);

        /* Right column */
        Button calculate = new Button("Calculate");
        Button cancel = new Button("Cancel");
        HBox runButtons = new HBox(calculate, cancel);
        VBox rightCol = new VBox(runButtons);
        rightCol.setStyle(blackBorder);

        /* Set up borderpane */
        BorderPane root = new BorderPane();
        root.setPadding(new Insets(15));
        root.setLeft(leftCol);
        root.setRight(rightCol);

        Scene scene = new Scene(root, 800, 600);
        stage.setScene(scene);
        stage.show();
    }

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

}

Вывод, который он выдает, показан на рисунке ниже:

enter image description here

Тем не менее, я хочу, чтобы это выглядело так:

enter image description here

Где слеваи правые столбцы равны ширине и занимают всю ширину окна.Кроме того, столбцы не меняют ширину с окном, поэтому пробел в середине увеличивается с увеличением размера окна.

Что мне нужно изменить, чтобы столбцы заполняли ширину окна?

(PS Я все еще учусь, поэтому, если бы решение могло избежать FXML (что я пока не понимаю), это было бы здорово)

РЕДАКТИРОВАТЬ: Согласно предложению @ k88, мой метод запуска теперь выглядит следующим образом:

public void start(Stage stage) throws Exception {
        String blackBorder = "-fx-border-style: solid; -fx-border-width: 1; -fx-border-color: black";

        Button calculate = new Button("Calculate");
        Button cancel = new Button("Cancel");
        HBox runButtons = new HBox(calculate, cancel);
        VBox rightCol = new VBox(runButtons);
        rightCol.setStyle(blackBorder);

        Button save = new Button("Save");
        Button del= new Button("Delete");
        HBox settings = new HBox(save, load);
        VBox leftCol = new VBox(settings);
        leftCol.setStyle(blackBorder);

        HBox root = new HBox(leftCol, rightCol);
        root.setPadding(new Insets(15));

        Scene scene = new Scene(root, 800, 600);
        stage.setScene(scene);
        stage.show();
    }

Предоставление окна, похожего на:

enter image description here

1 Ответ

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

Существуют различные способы решения этой проблемы.

  1. Если вы хотите получить выгоды от BorderPane (например, иметь верхнюю и нижнюю панели), вы можете установить HBox / GridPane в качестве центра (без установки влево / вправо).
  2. Если вас не беспокоит реализация верхнего и нижнего макетов, то, как и предложил @ k88, вы можете напрямую использовать HBox или GridPane в качестве корневого узла.

Использование HBox:

HBox.setHGrow(leftCol,Priority.ALWAYS);
HBox.setHGrow(rightCol,Priority.ALWAYS);
HBox root = new HBox();
root.setPadding(new Insets(15));
root.getChildren().addAll(leftCol, rightCol);

Использование GridPane:

GridPane root = new GridPane();
ColumnConstraints col1 = new ColumnConstraints();
col1.setPercentWidth(50);
ColumnConstraints col2 = new ColumnConstraints();
col2.setPercentWidth(50);
root.getColumnConstraints().addAll(col1,col2);
root.addRow(0, leftCol,rightCol);

Обновление: В любом случае, если вы хотите, чтобы ваши кнопки автоматически растягивались, привязайте ширину кнопок к их макету.Таким образом, вы можете контролировать пропорции ширины кнопок в HBox.

Button calculate = new Button("Calculate");
Button cancel = new Button("Cancel");
HBox runButtons = new HBox(calculate, cancel);
calculate.prefWidthProperty().bind(runButtons.widthProperty().divide(2));
cancel.prefWidthProperty().bind(runButtons.widthProperty().divide(2));

Обновление 2 : см. Пример демонстрации.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class Sample extends Application {

    public void start(Stage stage) throws Exception {
        String blackBorder = "-fx-border-style: solid; -fx-border-width: 1; -fx-border-color: black";

        Button calculate = new Button("Calculate");
        Button cancel = new Button("Cancel");
        HBox runButtons = new HBox(calculate, cancel);
        calculate.prefWidthProperty().bind(runButtons.widthProperty().divide(2));
        cancel.prefWidthProperty().bind(runButtons.widthProperty().divide(2));
        VBox rightCol = new VBox(runButtons);
        rightCol.setStyle(blackBorder);

        Button save = new Button("Save");
        Button del = new Button("Delete");
        HBox settings = new HBox(save, del);
        save.prefWidthProperty().bind(settings.widthProperty().divide(3)); // 1/3
        del.prefWidthProperty().bind(settings.widthProperty().divide(3).multiply(2)); // 2/3
        VBox leftCol = new VBox(settings);
        leftCol.setStyle(blackBorder);


        GridPane root = new GridPane();
        ColumnConstraints col1 = new ColumnConstraints();
        col1.setPercentWidth(50);
        ColumnConstraints col2 = new ColumnConstraints();
        col2.setPercentWidth(50);
        root.getColumnConstraints().addAll(col1,col2);
        root.addRow(0, leftCol,rightCol);

        Scene scene = new Scene(root, 800, 600);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String... a) {
        Application.launch(a);
    }
}
...