【问题标题】:Why does adding another element to a BorderPane mess up my formatting?为什么向 BorderPane 添加另一个元素会打乱我的格式?
【发布时间】:2022-09-07 04:38:44
【问题描述】:

在 BorderPane 的中心创建 GridPane 时,它​​是二次的,一切都很好:

即使列和行的数量不相等,一切都可以正常工作:

但是一旦我将 VBox 或任何其他元素添加到 BorderPane 的左侧插槽,它看起来像这样:

我需要 GridPane 保持二次方,至少在创建之后是这样。当调整大小时,单元格保持二次方并不重要,但它们应该是初始的。

我还尝试将 GridPane 包装在 VBox 中,将 VBox 包装在 HBox 中并绑定它们的高度和宽度属性,但这只会使单元格保持相同的大小。

基本上我希望它最初看起来像这样:

我认为如果可以告诉 GridPane 不要向上、向下和按站点填充空白空间,那将很容易。

fxml 文件:

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

<?import javafx.scene.layout.*?>

<BorderPane maxHeight=\"-Infinity\" maxWidth=\"-Infinity\" xmlns=\"http://javafx.com/javafx/16\" xmlns:fx=\"http://javafx.com/fxml/1\" fx:controller=\"gui.UserInterfaceController\">
   <center>
      <GridPane fx:id=\"grdPn\" gridLinesVisible=\"true\" onMouseClicked=\"#onGrdPnMouseClicked\">
        <columnConstraints>
          <ColumnConstraints hgrow=\"SOMETIMES\" minWidth=\"10.0\" prefWidth=\"30.0\" />
          <ColumnConstraints hgrow=\"SOMETIMES\" minWidth=\"10.0\" prefWidth=\"30.0\" />
            <ColumnConstraints hgrow=\"SOMETIMES\" minWidth=\"10.0\" prefWidth=\"30.0\" />
            <ColumnConstraints hgrow=\"SOMETIMES\" minWidth=\"10.0\" prefWidth=\"30.0\" />
            <ColumnConstraints hgrow=\"SOMETIMES\" minWidth=\"10.0\" prefWidth=\"30.0\" />
            <ColumnConstraints hgrow=\"SOMETIMES\" minWidth=\"10.0\" prefWidth=\"30.0\" />
            <ColumnConstraints hgrow=\"SOMETIMES\" minWidth=\"10.0\" prefWidth=\"30.0\" />
            <ColumnConstraints hgrow=\"SOMETIMES\" minWidth=\"10.0\" prefWidth=\"30.0\" />
            <ColumnConstraints hgrow=\"SOMETIMES\" minWidth=\"10.0\" prefWidth=\"30.0\" />
            <ColumnConstraints hgrow=\"SOMETIMES\" minWidth=\"10.0\" prefWidth=\"30.0\" />

      
      
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight=\"10.0\" prefHeight=\"30.0\" vgrow=\"SOMETIMES\" />
          <RowConstraints minHeight=\"10.0\" prefHeight=\"30.0\" vgrow=\"SOMETIMES\" />
        </rowConstraints>
      </GridPane>
   </center>
   <left>
      <VBox prefHeight=\"306.0\" prefWidth=\"100.0\" BorderPane.alignment=\"CENTER\" />
   </left>
</BorderPane>

创建舞台和场景:

        FXMLLoader fxmlLoader = new FXMLLoader(ApplicationMain.class.getResource(\"sample.fxml\"));
        Scene scene = new Scene(fxmlLoader.load());
        stage.setTitle(\"Example\");
        stage.setScene(scene);
        stage.show();

如果您移除 VBox,GridPane 将再次变为方形。

  • 抱歉,马上上来。
  • 基本上,你得到了中间布局,因为你在 vbox 上硬编码大小限制:不要 :) 顺便说一句:确保你了解每个布局窗格是如何工作的(研究它的广泛的 java doc 和/或周围有很多教程 :) 对于任何下一个问题:请遵循参考帮助页面中的建议 - 该示例必须按原样运行(这不是,即使将 start 方法的内容复制到快速设置的应用程序中 -由于缺少控制器,它会在加载时抛出 ..)

标签: java javafx gridpane borderpane


【解决方案1】:

这是一个例子,希望对你有所帮助。我的猜测是 GridPane Max Height = USE_PREF_SIZE 是你要找的。

FXML

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<BorderPane xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" maxHeight="-Infinity" maxWidth="-Infinity" fx:controller="gui.UserInterfaceController">
   <left>
      <VBox prefHeight="306.0" prefWidth="100.0" style="-fx-border-color: black;" BorderPane.alignment="CENTER">
         <BorderPane.margin>
            <Insets bottom="10.0" left="10.0" top="10.0" />
         </BorderPane.margin>
      </VBox>
   </left>
   <center>
      <GridPane fx:id="grdPn" gridLinesVisible="true" maxHeight="-Infinity" onMouseClicked="#onGrdPnMouseClicked" BorderPane.alignment="CENTER">
         <columnConstraints>
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="40.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="40.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="40.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="40.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="40.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="40.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="40.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="40.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="40.0" />
            <ColumnConstraints hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="40.0" />
         </columnConstraints>
         <rowConstraints>
            <RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="40.0" vgrow="SOMETIMES" />
            <RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="40.0" vgrow="SOMETIMES" />
         </rowConstraints>
         <BorderPane.margin>
            <Insets right="10.0" />
         </BorderPane.margin>
      </GridPane>
   </center>
</BorderPane>

输出

【讨论】:

  • 是否可以推断出 FXML 中的 maxHeight="-Infinity" 使用 valueOf() 隐式计算为 setMaxSize(USE_PREF_SIZE)
  • 那是对的。至少,这就是它在SceneBuilder 中显示的内容。
猜你喜欢
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 2019-01-08
  • 2015-01-29
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多