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);
});