JavaFX - 如何制作ComboBox hgrow?

Ben*_*Ben 11 combobox javafx javafx-8


我有JavaFX(8),HBox,ComboBox和HGrow的问题.HGrow不能与ComboBox结合使用.

(INFO:使用TextField(而不是ComboBox),它按预期工作!)

这是我的FXML代码:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<VBox prefHeight="117.0" prefWidth="285.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.test.TestController">
  <children>
     <HBox prefHeight="105.0" prefWidth="196.0" VBox.vgrow="ALWAYS">
     <children>
        <ComboBox fx:id="fxCboTest" prefHeight="25.0" prefWidth="62.0" HBox.hgrow="ALWAYS" />
     </children>
    </HBox>
  </children>
</VBox>
Run Code Online (Sandbox Code Playgroud)

本准则将导致:

在此输入图像描述

我也试过以下代码(没有成功,这段代码什么也没做):

HBox.setHgrow(uiController.fxCboTest, Priority.ALWAYS);
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何制作ComboBox HGrow?

Ben*_*Ben 26

这是我自己的问题的答案.
经过一些测试,我发现当将Max Width设置为MAX_VALUE时,它可以工作:

在此输入图像描述

这将导致以下来自SceneBuilder的code/xml:

...
<children>
   <ComboBox maxWidth="1.7976931348623157E308" prefWidth="150.0" HBox.hgrow="ALWAYS" />
</children>
...
Run Code Online (Sandbox Code Playgroud)

其中1.7976931348623157E308看起来像Double.MAX_VALUE.

这也适用于Hbox中的多个控件.
在此输入图像描述

在我看来,这不是非常/持续.
我仍然不知道为什么HGrow不能用于ComboBox.

  • 再挖一下默认设置.`maxWidth`默认为sentinel值`Region.COMPUTED_SIZE`,它会调用`computeMaxWidth(...)`.对于控件,这反过来委托皮肤实现.深入研究源代码,`ComboBoxBaseSkin`通过返回首选宽度来解决这个问题.`TextFieldSkin`只是继承了默认的`SkinBase`实现,返回`Double.MAX_VALUE`.因此,默认情况下,组合框仅限于其首选大小; 允许文本字段无限增长.底线是他们有不同的默认值. (4认同)