为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建没有中心的 JavaFX BorderPane?

如何创建没有中心的 JavaFX BorderPane?

胡子哥哥 2022-03-10 10:33:30
我想在 JavaFX 中创建一个没有中心窗格的 BorderPane 布局。到目前为止我写的代码只实现了左右边框,如下: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();    }}它给出的输出如下图所示:但是,我希望它看起来更像这样:其中左右列的宽度相等,并占据了窗口的整个宽度。此外,列不随窗口改变宽度,所以中间的空白会随着窗口变大而变大。我需要更改什么才能使列填充窗口的宽度?(PS我还在学习,所以如果解决方案可以避免FXML(我还不明白),那就太好了)
查看完整描述

1 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

有不同的方式来得到这个问题的解决。

  1. 如果你想获得还是从利益BorderPane(比如有顶部和底部窗格),您可以设置HBox/GridPane为中心(无设置左/右)。

  2. 如果你没有打扰约顶部和底部布局的实现,那么作为@ K88建议,您可以直接使用HBoxGridPane作为根节点。

使用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);

    }

}


查看完整回答
反对 回复 2022-03-10
  • 1 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信