我有一个包含javafx.scene.layout.HBox的JavaFX场景。此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控件至少包含一个非常长的选项,因此它几乎分配了所有空间(因为它的首选宽度比分配的空间大得多)。我在微调器控件上只能看到向上/向下箭头。

有谁知道我可以在考虑Spinner的首选宽度之前强制JavaFX为ComboBox对象分配空间?

最佳答案

您的解决方案可以工作,但是将minWidth对象的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);


保持其他所有条件不变,这些更改之一将产生所需的结果。

08-26 08:55
查看更多