带有prefWidth =“Infinity”的GridPane中的按钮会破坏JavaFX

时间:2014-01-14 10:15:00

标签: javafx javafx-2 fxml

我刚开始使用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",我会得到所需的结果,但我觉得这实际上是错误的编码。

所以我的问题是:

  • 这是JavaFX的错误吗?
  • 如何以更好的方式获得我想要的结果?

1 个答案:

答案 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"/>