2014-01-14 45 views
1

我只是JavaFX的開頭,所以請原諒,如果這是一個愚蠢的錯誤作出。按鈕與prefWidth =「無限」 GridPane打破JavaFX的

我有一個GridPane,我想使用有兩個按鈕旁邊的海誓山盟延到窗口的整個寬度。所以我創建了一個GridPane一行兩列,並添加到我的兩個按鈕中。

代碼爲:

<GridPane id="GridPane" alignment="TOP_LEFT" disable="false" gridLinesVisible="false" hgap="5.0"> 
    <children> 
    <Button mnemonicParsing="false" styleClass="add-button" text="Save" GridPane.columnIndex="0" GridPane.rowIndex="0" /> 
    <Button mnemonicParsing="false" text="Discard" GridPane.columnIndex="1" GridPane.rowIndex="0" /> 
    </children> 
    <columnConstraints> 
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> 
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> 
    </columnConstraints> 
    <rowConstraints> 
    <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
    </rowConstraints> 
</GridPane> 

但現在的按鍵僅佔據了必要的空間。所以我加了prefWidth="Infinity"他們兩個。這會導致Secene Builder 1.1立即凍結。我聽說Scene Builders是和可能是越野車,所以我手動編碼到FXML並試圖運行該程序。程序啓動但不打開窗口。

使用jvisualvm檢查正在運行的進程告訴我,JavaFX應用程序線程正在分配大量空間(用於獲得即時垃圾回收的數百萬個ArrayList)。它分配約1.2 GB /秒。相比之下,場景構建器似乎沒有做任何事情,當我試圖用它打開文件時,它的使用堆大約在16MB左右(它也不打開窗口)。

即使prefWidth只添加一個Button錯誤發生。如果我在兩個按鈕上使用例如prefWidth="100000000",我會得到期望的結果,但我認爲這是真的不好編碼。

所以我的問題是:

  • 這是JavaFX的一個錯誤?
  • 如何以更好的方式獲得我想要的結果?

回答

3

您應該使用maxWidth,而不是prefWidth。 JavaFX試圖將MAX值作爲按鈕的初始大小,因爲它是首選大小。最大尺寸只是一個參數,用於比較實際尺寸(在某些情況下,將尺寸設置爲最小值(實際尺寸不夠大:將其擴大到最小尺寸)或最大值(實際尺寸過大:減小到最大尺寸)),這可能是你需要的; maxWidth/maxHeight與「無限」值意味着你不會限制你的小部件的增長。

默認情況下,最大大小等於prefSize,這就是爲什麼你必須修改它有一個正確的HGROW/VGROW。在某些方面您是正確的:您需要修改最大大小,但不要更改預製大小。

像這樣的東西應該工作:

<Button fx:id="testButton" 
     text="Test" 
     maxWidth="Infinity" 
     maxHeight="Infinity" 
     GridPane.hgrow="ALWAYS" 
     GridPane.vgrow="ALWAYS" 
     GridPane.rowIndex="0" 
     GridPane.columnIndex="0"/> 
+0

好的設置'maxWidth = 「無限」'確實解決我的問題。但我不完全理解你的解釋。我怎麼看這是通過設置'maxWidth =「無限」'我告訴JavaFX的「嘿那裏基本上沒有上限,我的寬度」,並通過設置'prefWidth =「無限」'我說:「嘿,我想是巨大的寬度(但不是要求)「,以便JavaFX可以決定給我儘可能多的空間。但是這不知何故打破了整個過程沒有錯誤信息或任何東西。 – mgttlinger

+0

另外如果'maxWidth'等於'prefWidth'默認爲什麼不起作用? – mgttlinger

+0

@mgttlinger prefSize並不意味着具有「抽象」值,而是一個以像素爲單位的明確值,如果可能的話,javafx會爲該小部件使用該值。 「無限」只是表達增長的捷徑,因此它只能用作比較價值。我認爲javafx正在試圖繪製一個帶有Integer.MAX_VALUE的小部件作爲pref寬度,所以它只會殺死你的JVM。 – zenbeni