我刚开始使用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>
但现在Button只占用了他们必要的空间。所以我在其中添加了prefWidth="Infinity"
。这导致 Secene Builder 1.1 立即冻结。我听说场景构建器是,并且可能是有缺陷的,所以我手动将其编码到FXML并尝试运行该程序。程序启动但不打开窗口。
使用jvisualvm
检查正在运行的进程告诉我JavaFX应用程序线程正在分配大量空间(对于数百万ArrayList
s,它们立即被垃圾收集)。它分配大约1.2 GB / s。相比之下,当我尝试用它打开文件时,Scene Builder似乎什么也没做,因为它的使用堆非常常常在16MB左右(它也没有打开一个窗口)。
即使prefWidth
仅在Button
上添加,也会发生错误。如果我在两个按钮上使用例如prefWidth="100000000"
,我会得到所需的结果,但我觉得这实际上是错误的编码。
所以我的问题是:
答案 0 :(得分:3)
您应该使用maxWidth而不是prefWidth。 JavaFX正在尝试将MAX值计算为按钮的初始大小,因为它是首选大小。最大尺寸只是用于比较实际尺寸的参数(在某些情况下,将尺寸设置为最小值(实际尺寸不够大:将其增大到最小尺寸)或最大值(实际尺寸太大) :减少到最大尺寸)),它可能是你需要的;带有“无穷大”值的maxWidth / maxHeight意味着您不会限制窗口小部件的增长。
默认情况下,max size等于prefSize,这就是为什么你必须修改它以拥有正确的HGROW / VGROW。你在某些方面是正确的:你需要修改最大尺寸,但不要改变pref尺寸。
这样的事情应该有效:
<Button fx:id="testButton"
text="Test"
maxWidth="Infinity"
maxHeight="Infinity"
GridPane.hgrow="ALWAYS"
GridPane.vgrow="ALWAYS"
GridPane.rowIndex="0"
GridPane.columnIndex="0"/>