我只是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