gpt4 book ai didi

java - JavaFX 中的按钮对齐

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:05:04 25 4
gpt4 key购买 nike

我用关闭按钮创建了这个 JavaFX 对话框:

final int xSize = 300;
final int ySize = 280;
final Color backgroundColor = Color.WHITE;
final String text = "SQL Browser Version 1.0";

final Stage aboutDialog = new Stage();
aboutDialog.initModality(Modality.WINDOW_MODAL);

Button closeButton = new Button("Close");
closeButton.setAlignment(Pos.BOTTOM_CENTER);

closeButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
aboutDialog.close();
}
});

Scene aboutDialogScene = new Scene(VBoxBuilder.create()
.children(new Text(text), closeButton)
.alignment(Pos.CENTER)
.padding(new Insets(10))
.build(), xSize, ySize, backgroundColor);

aboutDialog.setScene(aboutDialogScene);
aboutDialog.show();

我想在对话框底部显示按钮。我用它来设置对齐方式:closeButton.setAlignment(Pos.BOTTOM_CENTER); 但是由于某种原因按钮显示在对话框的中心。你能告诉我如何解决这个问题吗?

最佳答案

如果你想为此使用一个VBox,你正在寻找的方法是:

VBox.setVgrow(node, Priority.ALWAYS);


默认情况下,VBox 只会将子项从您放置它的位置的左上角一个下一个地放置。子项不会展开以填满所有可用的垂直区域,除非您对具有无限最大高度的子项设置 Vgrow 约束。

您可以通过几种不同的方式获得所需的布局(还有其他方式):

  1. 使用 StackPane 而不是 VBox 并将按钮与 StackPane.setAlignment(closeButton, Pos.BOTTOM_CENTER); 对齐
  2. 使用 AnchorPane 代替 VBox 并适本地在 AnchorPane 上设置约束。
  3. 使用 spring region这是一个空白区域,可以扩展以填充空白空间。

示例 Spring 区域:

Region topSpring    = new Region();
Region bottomSpring = new Region();
Scene aboutDialogScene = new Scene(VBoxBuilder.create()
.children(topSpring, new Text(text), bottomSpring, closeButton)
.alignment(Pos.CENTER)
.padding(new Insets(10))
.build(), xSize, ySize, backgroundColor);
VBox.setVgrow(topSpring, Priority.ALWAYS);
VBox.setVgrow(bottomSpring, Priority.ALWAYS);

调用 closeButton.setAlignment(Pos.BOTTOM_CENTER); 设置 closeButton 内事物(文本和图形)的对齐方式,而不是 closeButton 在其父级内的对齐方式(这是您真正想要的).


要了解布局约束的工作原理,SceneBuilder是玩弄的好工具 ScenicView可以帮助调试现有代码中的布局问题。


这里有几个布局的 FXML 示例,您可以将它们加载到 SceneBuilder 中以查看不同布局选项的工作方式。

如果您愿意,可以使用 JavaFX API 使用纯 Java 轻松编写以下所有示例。我用 fxml 编写它们,因为它使布局易于在 SceneBuilder 中预览。

使用 StackPane 的 FXML 示例:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>

<StackPane id="StackPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
<children>
<Label text="SQL Browser Version 1.0" />
<Button mnemonicParsing="false" text="Button" StackPane.alignment="BOTTOM_CENTER" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</StackPane>

snapshot of fxml

一些 Spring 地区也是如此:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>

<VBox alignment="CENTER" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
<children>
<Region prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" />
<Label text="SQL Browser Version 1.0" />
<Region prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" />
<Button mnemonicParsing="false" text="Close" />
</children>
</VBox>

标签本身设置为扩展以填充 VBox 中的空白区域也是如此:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>

<VBox alignment="CENTER" prefHeight="280.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml">
<children>
<Label maxHeight="1.7976931348623157E308" text="SQL Browser Version 1.0" VBox.vgrow="ALWAYS" />
<Button mnemonicParsing="false" text="Close" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</VBox>

关于java - JavaFX 中的按钮对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16083683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com