JavaFX:GridPane中的ComboBox导致不必要的大小调整

我有一个有5列的GridPane.这些是我分别对列约束的hgrow设置.

>有时候
>总是
>有些人(固定大小)
>有时候
>总是

整个GridPane基本上是两列形式的布局.我的第1列和第4列(索引0和3)是字段标签,而第2列和第5列是输入字段(TextField等).第3列只是两个表单列之间的固定宽度填充.

我的表单中有一些ComboBox – 一些在左栏,一些在右栏.我已将所有ComboBox的最大宽度设置为MAX_VALUE.

当表单加载时,布局看起来像我想要的那样(两个输入字段列具有相等的宽度).但是,当我单击任何ComboBox时,它将导致单击的ComboBox所在的列的宽度增加 – 这会导致其他输入字段列减少相同的量.

我可以在左侧和右侧交替点击ComboBox,两列的宽度将不断变化.变化会越来越小,最终列会停止调整大小.最终结果是两列的宽度不相等.

我对来自JFoenix库的另一个控件JFXDatePicker有同样的问题.

我的另一个约束是这个表单在SplitPane中,所以我必须避免设置显式宽度.

我该怎么做才能解决这个问题?

编辑

我想我会在这里附上一个样本,考虑这个问题有多少看法.

@Override
public void start(Stage primaryStage) throws Exception {
    VBox root = FXMLLoader.load(getClass().getResource("Test.fxml"));
    Scene sc = new Scene(root);
    primaryStage.setScene(sc);
    primaryStage.show();
}

FXML:

<VBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
    <padding>
        <Insets bottom="30.0" left="30.0" right="30.0" top="30.0" />
    </padding>
   <children>
      <GridPane hgap="6.0" vgap="6.0" VBox.vgrow="ALWAYS">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" />
          <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" />
            <ColumnConstraints hgrow="SOMETIMES" />
            <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Label text="Left 1" GridPane.halignment="RIGHT" />
            <Label text="Left 2" GridPane.halignment="RIGHT" GridPane.rowIndex="1" />
            <Label text="Left 3" GridPane.halignment="RIGHT" GridPane.rowIndex="2" />
            <Label text="Right 1" GridPane.columnIndex="2" GridPane.halignment="RIGHT" />
            <Label text="Right 2" GridPane.columnIndex="2" GridPane.halignment="RIGHT" GridPane.rowIndex="1" />
            <Label text="Right 3" GridPane.columnIndex="2" GridPane.halignment="RIGHT" GridPane.rowIndex="2" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="3" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="3" GridPane.rowIndex="2" />
         </children>
      </GridPane>
   </children>
</VBox>

结果:

《JavaFX:GridPane中的ComboBox导致不必要的大小调整》

如GIF所示,当窗口最初启动时,布局就是我想要的.当我点击右侧的一个组合框时,该列突然增加了宽度并缩小了另一列.当点击任何组合框时,我需要两列的宽度保持不变.

更新

好像我错过了我的问题中的一些信息.我需要的最终结果是GridPane,在两个标签输入对中有4列.可以在对之间添加额外的列以在对之间添加额外的填充,但它是可选的.整个网格将处于可调整大小的环境中(例如在我的示例中 – 可调整大小的舞台).我相信可调整大小的环境并非不合理,否则我会给所有列绝对大小(甚至使用任何窗格并赋予它绝对位置)并且问题不会存在.

两个标签必须始终可见(除非整个GridPane减小到非常小的尺寸),并且必须为输入控件(TextField,ComboBox等)提供任何额外的空间.同样,如果GridPane收缩,我希望缩小输入列而不是标签列.标签列应始终保持固定大小,此大小是显示所有标签而不显示省略号所需的最小大小.

由于最终形式具有不同输入控件的混合,如果未将ComboBox的大小调整为与同一列中的其他输入控件相同的宽度,则会使ComboBox看起来很奇怪.我承认这个要求让我挑剔.

我还希望两个输入列具有相同的宽度,并且必须始终保持为真.

另一个更新

我已经对此做了一个bug report,它目前仍然以P3优先级开放.

最佳答案 我只是玩了设置,看看我能想出什么.这似乎有效.我在列上使用了百分比.

<VBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="162.0" prefWidth="326.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
    <padding>
        <!--Insets bottom="30.0" left="30.0" right="30.0" top="30.0" /-->
    </padding>
   <children>
      <GridPane hgap="6.0" vgap="6.0" VBox.vgrow="SOMETIMES">
        <columnConstraints>
          <ColumnConstraints halignment="RIGHT" hgrow="NEVER" percentWidth="15.0" />
          <ColumnConstraints hgrow="SOMETIMES" percentWidth="35.0" />
            <ColumnConstraints halignment="RIGHT" hgrow="NEVER" percentWidth="15.0" />
            <ColumnConstraints hgrow="SOMETIMES" percentWidth="35.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Label text="Left 1" GridPane.halignment="RIGHT" />
            <Label text="Left 2" GridPane.halignment="RIGHT" GridPane.rowIndex="1" />
            <Label text="Left 3" GridPane.halignment="RIGHT" GridPane.rowIndex="2" />
            <Label text="Right 1" GridPane.columnIndex="2" GridPane.halignment="RIGHT" />
            <Label text="Right 2" GridPane.columnIndex="2" GridPane.halignment="RIGHT" GridPane.rowIndex="1" />
            <Label text="Right 3" GridPane.columnIndex="2" GridPane.halignment="RIGHT" GridPane.rowIndex="2" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="3" />
            <ComboBox maxWidth="1.7976931348623157E308" GridPane.columnIndex="3" GridPane.rowIndex="2" />
         </children>
      </GridPane>
   </children>
</VBox>
点赞