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

时间:2017-05-11 01:13:50

标签: java javafx combobox javafx-8 gridpane

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

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

    我的表单中有一些ComboBox - 有些位于左侧列,有些位于右侧列。我已将所有ComboBox的最大宽度设置为MAX_VALUE

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

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

    我对JFXDatePicker库中的另一个控件JFoenix有同样的问题。

    我的另一个约束是这个表单在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>
    

    结果:

    Result

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

    更新

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

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

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

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

    另一次更新

    我已经对此进行了bug report,目前仍然以P3优先级打开。

2 个答案:

答案 0 :(得分:1)

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

!important

答案 1 :(得分:0)

这是一篇非常古老的帖子,但我刚遇到这个问题并发现最好的方法是动态地将宽度处理程序添加到ComboBox和GridPane,我有一个带标签的4 x 2网格/ combo / label / combo和你一样:

    cmbOne.setOnShowing(e -> detailsGrid.getColumnConstraints().get(1).setMaxWidth(cmbOne.getWidth()));
    cmbTwo.setOnShowing(e -> detailsGrid.getColumnConstraints().get(3).setMaxWidth(cmbTwo.getWidth()));
    detailsGrid.widthProperty().addListener(e -> {
        detailsGrid.getColumnConstraints().get(1).setMaxWidth(Double.MAX_VALUE);
        detailsGrid.getColumnConstraints().get(3).setMaxWidth(Double.MAX_VALUE);
    });

我设置了两个组合框以在打开之前锁定ColumnConstraint,然后当网格宽度改变时(通过调整大小)我允许它再次增加大小。