2015-04-07 101 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