2015-04-07 60 views
8


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

(INFO:用文本字段(而不是组合框),它按预期工作)JavaFX - 如何制作ComboBox hgrow?

这是我的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> 

规范将导致:

enter image description here

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

HBox.setHgrow(uiController.fxCboTest, Priority.ALWAYS); 

有没有人有一个想法如何使一个组合框HGrow?

回答

17

这是我自己的问题的答案。
经过一些测试,我发现设置最大宽度MAX_VALUE时,它的工作原理:

enter image description here

这将导致从SceneBuilder下面的代码/ XML:

... 
<children> 
    <ComboBox maxWidth="1.7976931348623157E308" prefWidth="150.0" HBox.hgrow="ALWAYS" /> 
</children> 
... 

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

这也适用于Hbox中的多个控件。
enter image description here

在我看来,这不是很结果/一贯
我仍然不明白为什么HGrow不适用于ComboBox。

+0

'hgrow'不会覆盖可调整大小的节点的最大宽度,默认情况下会将其设置为首选大小。在[教程](http://docs.oracle.com/javase/8/javafx/layout-tutorial/size_align.htm#JFXLY133)中有一些关于此的信息,同时也是一个很棒的[在Parleys上的演示文稿](https: //www.parleys.com/tutorial/interface-layout-javafx-2-0)(需要注册)。 –

+1

那么,为什么在用XML中的TextField替换ComboBox时会起作用呢? – Ben

+4

在默认设置中挖掘一点。 'maxWidth'默认为两个标记值'Region.COMPUTED_SIZE',这会导致对'computeMaxWidth(...)'的调用。对于控件,这反过来委托给皮肤实现。挖掘源代码,'ComboBoxBaseSkin'通过返回首选宽度来解决这个问题; 'TextFieldSkin'只是继承了默认的'SkinBase'实现,它返回'Double.MAX_VALUE'。因此,默认情况下组合框限于其首选大小;一个文本字段被允许无限增长。底线是他们有不同的默认值。 –

1

这是一个黑客,但它应该工作。在控制器的初始化方法内部,定义一个绑定。

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    fxCboTest.prefWidthProperty().bind(hbox.widthProperty()); 
} 
+0

感谢您的建议,但此代码可能无法正常工作时(不在我的代码示例中,因为我希望保持我的示例尽可能简单)hbox包含多个控件,如ComboBox和Button。我想避免自己计算太多。 – Ben

+0

这个问题从来没有提到你想要HBox中的多个孩子。 – ItachiUchiha

+0

你是对的,这就是为什么我给你的答案添加评论为什么你的解决方案**可能**不适用于多个控件。我没有说过你的解决方案绝对无益。 – Ben