Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:GridPane中的ComboBox会导致不必要的大小调整_Java_Javafx_Combobox_Javafx 8_Gridpane - Fatal编程技术网

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

JavaFX:GridPane中的ComboBox会导致不必要的大小调整,java,javafx,combobox,javafx-8,gridpane,Java,Javafx,Combobox,Javafx 8,Gridpane,我有一个网格窗格,有5列。这些分别是我对列约束的hgrow设置 有时 始终 有时(固定大小) 有时 始终 整个GridPane基本上是两列表单的布局。我的第1列和第4列(索引0和3)是字段标签,第2列和第5列是输入字段(TextFieldetc)。第3列只是两个表单列之间的固定宽度填充 我的表单中有一些组合框——一些在左边的列上,一些在右边的列上。我已将所有组合框的最大宽度设置为max\u值 加载表单时,布局与我预期的一样(两个输入字段列的宽度相同)。但是,当我单击任何一个组合框时,它会导致单击

我有一个
网格窗格
,有5列。这些分别是我对列约束的
hgrow
设置

  • 有时
  • 始终
  • 有时
    (固定大小)
  • 有时
  • 始终
  • 整个
    GridPane
    基本上是两列表单的布局。我的第1列和第4列(索引0和3)是字段标签,第2列和第5列是输入字段(
    TextField
    etc)。第3列只是两个表单列之间的固定宽度填充

    我的表单中有一些
    组合框
    ——一些在左边的列上,一些在右边的列上。我已将所有
    组合框的最大宽度设置为
    max\u值

    加载表单时,布局与我预期的一样(两个输入字段列的宽度相同)。但是,当我单击任何一个
    组合框
    时,它会导致单击的
    组合框
    打开的列的宽度增加-这会导致其他输入字段列的宽度减少相同的量

    我可以交替单击左右两侧的
    组合框
    ,两列的宽度将不断变化。更改将变得越来越小,最终列将停止调整大小。最终结果是两列的宽度不相等

    对于另一个来自
    JFoenix
    库的控件
    JFXDatePicker
    ,我遇到了同样的问题

    我的另一个限制是,此表单位于
    拆分窗格中,因此我必须避免设置显式宽度

    我能做些什么来解决这个问题

    编辑 我想我会在这里附上一个样本,考虑到这个问题的观点是多么少

    @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:

    
    
    结果是:

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

    更新 我的问题似乎遗漏了一些信息。我需要的最终结果是一个
    GridPane
    ,两个标签输入对中有4列。可以在对之间添加额外的列以在对之间添加额外的填充,但这是可选的。整个网格将处于一个可调整大小的环境中(例如,在我的示例中,是一个可调整大小的阶段)。我相信可调整大小的环境并不是不合理的,否则我会给所有列指定绝对大小(甚至使用任何
    窗格
    并给它指定绝对位置),问题就不会存在了

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

    由于最终表单混合了不同的输入控件,如果不将其大小调整为与同一列中的其他输入控件相同的宽度,则会使组合框看起来很奇怪。我承认这个要求是我太挑剔了

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

    另一个更新
    我已经对此做了详细说明,目前它仍然以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,然后当网格宽度更改(通过调整大小)时,我允许它再次增大大小

    当然,这将防止2个组合框列随机更改其宽度,但我的标签列的宽度正在缩放,这是我不想看到的。我需要标签列的宽度足以容纳所有标签。
        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);
        });