具有可调整大小的组件和绑定的JavaFX布局是否合适? (包括图片)

时间:2015-04-09 22:31:38

标签: javafx resize bind

我正在创建一个包含其中组件的2x2网格。它们看起来如下图所示:

enter image description here

我不确定适当的布局应该是什么。问题是右下方并没有真正对齐......所以我猜测网格布局不会起作用(或者可以吗?)。我想我做了一个BorderPane并且顶部包含前两个窗格,底部包含底部两个窗格,然后在那里做另一个BorderPane并从那里开始。

1)这是解决此问题的好方法(忽略中心的边框布局),还是有更好的布局?

下一步:蓝色框将根据整个屏幕的大小调整大小。我遇到的问题是,在变大之后,当它缩小时,黑匣子(应始终保持相同的尺寸,不包括那些应该调整大小的蓝色边框)

2)有没有办法让黑匣子调整到蓝框的大小?

我的意思是:如果蓝框垂直增长,右上方的窗格也必须垂直延伸。同样,如果蓝色的那个,它也必须缩小。这可以通过绑定两个高度来完成吗?由于底部矩形不会扩展,有没有办法绑定它,所以如果整个窗格的高度为x,则JavaFX将为我计算的绑定高度为x - bottomFixedHeight,但也不会比让我们说128(作为一个任意的例子)小吗?

注意:我不熟悉多个绑定,我试图谷歌它虽然可能有一个例子可以帮助。

1 个答案:

答案 0 :(得分:2)

<强> 背景

恕我直言,BorderPane是您可以用于上述场景的最佳布局。

BorderPane的Javadoc说,

  

顶部和底部子项将调整为其首选高度并扩展边框窗格的宽度。左右子项将调整为其首选宽度,并扩展顶部和底部节点之间的长度。并且将调整中心节点的大小以填充中间的可用空间。

enter image description here

所以使用TOP和BOTTOM不是一个合适的场景。我建议你去CENTER和BOTTOM。


<强>

现在我们决定使用BorderPane,让我们决定可以用来填充四个空间的布局。

  1. 正如我们在上图中所看到的,我们可以使用BorderPane的CENTER和RIGHT来创建上半部分。让我们将VBox添加到边框的中心和右边空间。右侧的VBox必须指定PREF_WIDTHMAX_WIDTH,以确保它不超过提供的WIDTH。如果你想要MIN_WIDTH,你也可以提供它。
  2. 对于BOTTOM,我们可以使用HBox,然后为其添加两个VBox。对于第一个VBox,我们希望它在宽度上超过,当重新调整大小时,我们将设置HBox.hgrow="ALWAYS"。对于右下角VBox,我们将再次设置宽度,就像我们对右上角VBoxHBox.hgrow="NEVER"所做的那样。
  3. 注意: 您可以使用首选布局替换VBox。 PREF_WIDTH和PREF_HEIGHT用于初始宽度和高度

    我使用了scenebuilder创建了一个示例,输出如图所示

    enter image description here

    <强> FXML

    <BorderPane minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
       <bottom>
          <HBox prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER">
             <children>
                <VBox prefHeight="100.0" prefWidth="100.0" style="-fx-border-color: green;" HBox.hgrow="ALWAYS" />
                <VBox minWidth="70.0" prefHeight="200.0" prefWidth="70.0" style="-fx-border-color: black;" HBox.hgrow="NEVER" />
             </children>
          </HBox>
       </bottom>
       <right>
          <VBox minWidth="100.0" prefHeight="200.0" prefWidth="100.0" style="-fx-border-color: red;" BorderPane.alignment="CENTER" />
       </right>
       <center>
          <VBox prefHeight="200.0" prefWidth="100.0" style="-fx-border-color: blue;" BorderPane.alignment="CENTER" />
       </center>
    </BorderPane>
    

    作者注意: 虽然我不认为绑定在这里很重要,但如果你想要更好的控制,你可以使用它。