我有一个JavaFX场景,其中包含一个javafx.scene.layout.HBox
。这个HBox
包含两个子级,一个javafx.scene.control.ComboBox
和一个javafx.scene.control.Spinner
。说明我的问题的最小FXML文件是:
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Spinner?>
<?import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory?>
<?import javafx.scene.layout.HBox?>
<HBox xmlns="http://javafx.com/javafx/8.0.65"
xmlns:fx="http://javafx.com/fxml/1">
<children>
<ComboBox fx:id="myComboBox" />
<Spinner fx:id="mySpinner" editable="true">
<valueFactory>
<SpinnerValueFactory.IntegerSpinnerValueFactory
min="0" max="999" initialValue="0" />
</valueFactory>
</Spinner>
</children>
</HBox>
在代码中,ComboBox
使用非常长的字符串(以字符为单位)填充。我还指定了所需的Spinner
宽度。下面的代码代表了我正在做的事情:
@FXML
private ComboBox<String> myComboBox;
@FXML
private Spinner<Integer> mySpinner;
@Override
public void initialize(URL location, ResourceBundle resources) {
myComboBox.getItems().setAll(
"Some very long string that takes up a very large portion" +
" of the screen. You can probably see where this is going.");
mySpinner.getEditor().setPrefColumnCount(3);
}
所期望的效果是为Spinner
控件分配它的首选宽度,并为ComboBox
控件分配空间的其余部分。但是,我看到的是,由于ComboBox
控件至少包含一个非常长的选项,所以它几乎分配了所有的空间(因为它的首选宽度要比分配的空间大得多)。我在旋转器控件上所能看到的就是上下箭头。
有人知道我如何在考虑JavaFX的首选宽度之前强制Spinner
对象分配空间吗?
发布于 2016-05-12 08:34:49
您的解决方案可以工作,但是将Spinner
对象的Spinner
设置为等于首选宽度比较简单。将原始的FXML更改为:
...
<Spinner fx:id="mySpinner" editable="true" minWidth="-Infinity">
<ComboBox fx:id="myComboBox" HBox.hgrow="ALWAYS" maxWidth="Infinity" />
...
这相当于在代码中执行以下操作:
mySpinner.setMinWidth(Region.USE_PREF_SIZE);
将其他一切保持不变,这些更改中的任何一个都将产生所需的结果。
发布于 2016-05-12 07:33:04
我想出了解决办法。在FXML中,我需要在prefWidth
元素上同时指定ComboBox
和maxWidth
:
...
<ComboBox fx:id="myComboBox" prefWidth="200" maxWidth="Infinity" />
...
然后,在初始化方法中,我必须添加以下行:
HBox.setHgrow(myComboBox, Priority.ALWAYS);
这解决了我的问题。现在我看到了另一个问题,那就是Spinner
控件的大小远远超过3个字符。然而,由于它是一个非主题,我将对这个悬而未决的问题提出另一个问题。
https://stackoverflow.com/questions/37191212
复制相似问题