繁体   English   中英

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

[英]JavaFX: ComboBox in GridPane causes unnecessary resizing

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

  1. SOMETIMES
  2. ALWAYS
  3. SOMETIMES (固定尺寸)
  4. SOMETIMES
  5. ALWAYS

整个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>

结果:

结果

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

更新资料

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

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

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

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

另一个更新

我对此进行了一个错误报告 ,并且目前仍以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>

这是一篇很老的文章,但是我刚遇到这个问题,发现最好的方法是将宽度处理程序动态添加到ComboBox和GridPane中,我有一个4 x 2的带有label / 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,然后在更改网格宽度(通过调整大小)后,我允许它再次增加大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM