2014-01-14 19 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