Jai*_*Jai 5 java combobox javafx javafx-8 gridpane
我有一个GridPane
5 列。这些分别是我hgrow
对列约束的设置。
SOMETIMES
ALWAYS
SOMETIMES
(固定尺寸)SOMETIMES
ALWAYS
整体GridPane
基本上是一个两栏形式的布局。我的第 1 和第 4 列(索引 0 和 3)是字段标签,而第 2 和第 5 列是输入字段(TextField
等)。第 3 列只是两个表单列之间的固定宽度填充。
ComboBox
我的表格中有一些- 有些在左栏,有些在右栏。我已将所有的最大宽度设置ComboBox
为MAX_VALUE
.
当表单加载时,布局看起来像我想要的(两个输入字段列的宽度相等)。但是,当我单击任何一个时ComboBox
,它会导致单击的列的ComboBox
宽度增加 - 这会导致另一个输入字段列减少相同的数量。
我可以交替单击ComboBox
左侧和右侧的 ,并且两列的宽度会不断变化。变化会越来越小,最终列将停止调整大小。最终结果是两列的宽度不相等。
对于库中的另一个控件JFXDatePicker
,我遇到了同样的问题JFoenix
。
我的另一个限制是这个表单在 a 内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();
}
Run Code Online (Sandbox Code Playgroud)
文件格式:
<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>
Run Code Online (Sandbox Code Playgroud)
结果:
如GIF所示,布局是我最初启动窗口时想要的。当我单击右侧的一个组合框时,该列突然增加了宽度并缩小了另一列。当单击任何组合框时,我需要两列的宽度保持不变。
似乎我在问题中遗漏了一些信息。我需要的最终结果是GridPane
在两个标签输入对中有 4 列。可以在对之间添加额外的列以在对之间添加额外的填充,但它是可选的。整个网格将处于可调整大小的环境中(例如在我的示例中 - 可调整大小的舞台)。我相信可调整大小的环境并非不合理,否则我会给出所有列的绝对大小(甚至使用任何列Pane
并给出绝对位置)并且问题不会存在。
两个标签必须始终可见(除非整个GridPane
被减小到非常小的尺寸),以及任何额外的空间必须被提供给输入控件(TextField
,ComboBox
等)。同样,如果GridPane
缩小,我希望输入列而不是标签列缩小。标签列应始终保持固定大小,此大小是显示所有标签而不出现省略号所需的最小大小。
由于最终的表单混合了不同的输入控件,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>
Run Code Online (Sandbox Code Playgroud)