提问者:小点点

JavaFX HBox HGrow优先级


我有一个JavaFX场景,其中包含一个javafx.场景.布局. HBox。这个HBox包含两个孩子,一个javafx.场景.control.ComboBox后跟一个javafx.场景.control.Spner。说明我的问题的最小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填充了很长(以字符为单位)的字符串。我还指定了Spiner所需的宽度。以下代码代表了我正在做的事情:

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

期望的效果是Spinger控件被分配它的首选宽度,ComboBox控件被赋予剩余的空间。然而,我看到的是,由于ComboBox控件至少包含一个很长的选项,它被分配了几乎所有的空间(因为它的首选宽度比分配的空间大得多)。我在微调控件上看到的只是向上/向下箭头。

有人知道如何在考虑ComboBox的首选宽度之前强制JavaFX为Spinger对象分配空间吗?


共2个答案

匿名用户

您的解决方案有效,但将Spner对象的minWidth设置为等于首选宽度会更简单。将原始FXML更改为以下内容:

...
<Spinner fx:id="mySpinner" editable="true" minWidth="-Infinity">
<ComboBox fx:id="myComboBox" HBox.hgrow="ALWAYS" maxWidth="Infinity" /> 
...

这相当于在代码中执行以下操作:

mySpinner.setMinWidth(Region.USE_PREF_SIZE);

让其他一切保持不变,这些变化中的任何一个都会产生预期的结果。

匿名用户

我想出了如何解决这个问题。在FXML中,我需要在ComboBox元素上指定prefWidthmaxWidth

...
<ComboBox fx:id="myComboBox" prefWidth="200" maxWidth="Infinity" />
...

然后,在初始化方法中,我必须添加以下行:

HBox.setHgrow(myComboBox, Priority.ALWAYS);

这解决了我的问题。现在我看到了另一个问题,即Spinger控件的大小远未达到3个字符。但是,由于它偏离了主题,我将为这个悬而未决的问题提出另一个问题。