如何使用FXML在JavaFX 2中指定宽度百分比?

时间:2012-03-23 01:12:11

标签: javafx-2

我正在寻找一种方法来说明在FXML中将maxWidth大小设置为80%。

与网络开发非常相似。

<VBox fx:id="testVB" prefWidth="600">

但这不是:
<VBox fx:id="testVB" prefWidth="80%">

我知道在Straight JavaFX2中非fxml你可以创建insets吗?在FMXL代码之外执行此操作的最佳方法是什么?

谢谢!

莱利

3 个答案:

答案 0 :(得分:22)

我不确定你能不能。您需要使用GridPane布局组件。在此组件中,您可以指定行和列约束,在这些约束中,您可以将宽度指定为百分比。例如:

<GridPane>
    <children>
        <TitledPane text="testGridPane" GridPane.columnIndex="0" GridPane.rowIndex="0" />
    </children>
    <columnConstraints>
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="80.0" prefWidth="100.0" />
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="20.0" prefWidth="100.0" />
    </columnConstraints>
    <rowConstraints>
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    </rowConstraints>
</GridPane>

此代码定义GridPane,第一列宽度为80%。 TitledPane在此GridPane的第一列的第一个单元格中设置,并且可以(因为您需要确保TitledPane的宽度限制符合您的需要)占用80 GridPane宽度的百分比。

请注意,我删除了与您的问题无关的所有信息。顺便说一下,Oracle的Scene Builder工具对于定义复杂的FXML布局非常有用。

答案 1 :(得分:9)

似乎已经提供了很多答案,它们应该可行。 ,有一种设置百分比的方法:

<fx:define>
    <Screen fx:factory="getPrimary" fx:id="screen" />
</fx:define>

这将有助于您检测当前屏幕的尺寸,正在显示应用程序。现在我们有了显示尺寸,我们可以在FXML中使用它,如下所示:

<HBox fx:id="hroot" prefHeight="${screen.visualBounds.height}" prefWidth="${screen.visualBounds.width}"> Your FXML elements inside the root... </HBox>

请注意,我使用 visualBounds ,因为这会让我获得屏幕上的可用空间,因为我不想在Windows中与任务栏重叠。对于全屏应用程序,您只需使用&#39; bounds&#39;。

现在,为了达到使用百分比的目的,您实际上可以使用prefheight和prefWidth的值。您可以将计算放在 $ {}

<强> 任选地:

如果您想让所有元素都使用相对大小,只需使用它们的ID和宽度或高度属性来引用它们,然后进行计算。

<VBox fx:id="VBSidebar" prefWidth="${hroot.width*0.15}" prefHeight="${hroot.height}"> more elements.. </VBox>

希望这有帮助!

答案 2 :(得分:0)

您可以模拟它 - 模拟HBox中两个cols 50%的基本示例。你可以添加虚拟窗格来获得三分之一等等。

    HBox {
        VBox {
            static hgrow : "ALWAYS",
            Label {
                text : "Privacy",
                alignment : "CENTER",
                styleClass : ["h2", "heading"]
            }
        },
        VBox {
            static hgrow : "ALWAYS",
            Label {
                text : "Messages",
                alignment : "CENTER",
                styleClass : ["h2", "heading"]
            },
            Label {text:""}
        }
    }