【发布时间】:2016-02-02 17:21:26
【问题描述】:
非常感谢您对我的问题的帮助。
我正在使用 JavaFX 和 NetBeans IDE。 我正在为桌面客户端制作一个非常简单的启动窗口。 窗口当前看起来像这个图像。
当前外观:
想要的外观(用油漆编辑):
换句话说,我希望按钮是:
- 在“欢迎”文本下方居中
- 保持当前宽度
我目前的设置是:
我有一个 GridPane 作为根。不确定为什么 JavaFX 选择使用 (col,row),但这就是我将在下面表示我的设置的方式:
- @GridPane(0,0) -> '欢迎'文本
- @GridPane(0,1) -> VBox(此 VBox 包含上图所示的 2 个按钮)
相关代码(或我认为相关的,如有错误请指正)如下:
//adds GridPane to Scene
GridPane grid = new GridPane();
RowConstraints row1 = new RowConstraints();
row1.setPercentHeight(25);
grid.getRowConstraints().add(row1);
grid.setAlignment(Pos.CENTER);
Scene scene = new Scene(grid, 400, 300,Color.WHITESMOKE);
//Create welcome message and add it to grid, and align it to the center
Text sceneTitle = new Text("Welcome");
grid.add(sceneTitle,0,0);
GridPane.setHalignment(sceneTitle,HPos.CENTER);
//Create buttons and fix their widths
Button newBtn = new Button("Create New Project");
Button loadBtn = new Button("Load Existing Project");
newBtn.setMaxWidth(150);
loadBtn.setMaxWidth(150);
//Create a VBox, add children to it, and then add it to the grid
VBox vBtns = new VBox();
vBtns.setSpacing(5);
vBtns.getChildren().addAll(newBtn,loadBtn);
grid.add(vBtns,0,1);
我尝试了很多不同的东西.. 提到一些更“合乎逻辑”的东西:
//1. Center the VBox within its current GridPane cell
GridPane.setHalignment(vBtns,HPos.CENTER);
//2. Center the buttons within the VBox
newBtn.setAlignment(Pos.CENTER);
loadBtn.setAlignment(Pos.CENTER);
我从来都不擅长 GUI 编程。当一件本应如此简单的事情需要这么长时间才能弄清楚时,这是非常令人沮丧的。 有没有开发人员可以帮助我找到解决方案?
【问题讨论】:
-
不要试图在 GridPane 中与之抗争。相反,将你的东西包装在另一个 VBox 中,使其宽度为 100%,并使其内容居中。然后你的内部内容将位于该 VBox 的中心。 JavaFX/FXML 就是将元素嵌套在其他元素中以获得您想要的样式。 (另外,您应该真正检查 FXML 而不是手动编写此 gui,JavaFX 确实从 FXML 中受益,然后您可以使用 SceneBuilder 拖放您的 GUI 元素并将它们全部对齐,等等。)。
-
或者,只需将所有三个内容放在一个
VBox中。或单个GridPane。但是这里根本不需要两个布局窗格。 -
@SnakeDoc 嗨!是的,我已经安装了 Scene Builder 插件。我对嵌套元素没有按照我想要的方式居中感到不满意,所以我回到了代码。
-
@HenryLin 使用 FXML 而不是手动编写所有 UI 将使事情更“易于管理”,尽管显然存在学习曲线。 SceneBuilder 可以做所有你可以用代码做的事情,所以如果它没有按照你想要的方式工作,那可能是因为你没有勾选正确的选项或其他东西。这绝对值得学习,并且会为您节省大量时间。
-
@James_D 我之前尝试将它们全部放入一个 VBox 中,但我切换回了 GridPane,因为我想添加一个小图标以显示在“欢迎”文本的左侧。不幸的是,我不得不把它拿出来,因为我无法让包含 ImageView 的文本正确居中。