【问题标题】:JavaFX HBox HGrow PriorityJavaFX HBox HGrow 优先级
【发布时间】:2016-09-08 12:59:49
【问题描述】:

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

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

【问题讨论】:

  • minWidth 没有帮助?
  • 我不知道为minWidth 输入什么,因为它取决于所使用的字体。我观察到 RedHat Linux 使用比 Windows 7 大得多的默认字体。在事先不知道字体(或用户可配置的设置,如 Windows 中的字体大小)的情况下,很难确定制作 minWidth 所需的幻数有用。
  • 可以通过spinner.getEditor().getFont()获取Spinner的字体

标签: java javafx java-8 javafx-8


【解决方案1】:

您的解决方案有效,但将Spinner 对象的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 中设置 hgrow 属性,因为它摆脱了 myComboBox.prefWidth 的幻数。
【解决方案2】:

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

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

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

HBox.setHgrow(myComboBox, Priority.ALWAYS);

这解决了我的问题。现在我看到另一个问题,即Spinner 控件的大小远不及 3 个字符。但是,由于它是题外话,我将针对该未决问题打开另一个问题。

【讨论】:

  • Spinner 需要设置 minSize,ComboBox 不需要设置 hGrow
  • 您能否更具体地介绍一下您对使用minSize 的建议?当我将minWidth="1" minHeight="1" 添加到Spinner FXML 并从ComboBox 中删除prefWidthmaxWidth 属性时,我仍然得到几乎为0 宽度的Spinner(Win 7 Enterprise SP1 x64 上的JRE 8u77 )。你看到了什么不同的东西,还是我误解了你的建议?
  • 你是对的。您必须为组合框设置 hGrow。关于 minWidth 我添加了一个答案
猜你喜欢
  • 2017-07-15
  • 2015-06-11
  • 2015-06-24
  • 2019-12-23
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 2014-12-01
相关资源
最近更新 更多