我只是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的一個錯誤?
- 如何以更好的方式獲得我想要的結果?
好的設置'maxWidth = 「無限」'確實解決我的問題。但我不完全理解你的解釋。我怎麼看這是通過設置'maxWidth =「無限」'我告訴JavaFX的「嘿那裏基本上沒有上限,我的寬度」,並通過設置'prefWidth =「無限」'我說:「嘿,我想是巨大的寬度(但不是要求)「,以便JavaFX可以決定給我儘可能多的空間。但是這不知何故打破了整個過程沒有錯誤信息或任何東西。 – mgttlinger
另外如果'maxWidth'等於'prefWidth'默認爲什麼不起作用? – mgttlinger
@mgttlinger prefSize並不意味着具有「抽象」值,而是一個以像素爲單位的明確值,如果可能的話,javafx會爲該小部件使用該值。 「無限」只是表達增長的捷徑,因此它只能用作比較價值。我認爲javafx正在試圖繪製一個帶有Integer.MAX_VALUE的小部件作爲pref寬度,所以它只會殺死你的JVM。 – zenbeni