3

背景/上下文:

我有一个 HBox 作为父节点和许多子节点(按钮、文本字段、标签……)。HBox 是其他容器的子容器 (BorderPane/VBox/Grid)

我的问题:

如何从布局中动态删除/排除父级(HBox)及其所有子级?

我正在寻找 Node 上的一些三态属性(例如在 Microsoft WPF 中):

Visible – 可见并参与布局

Collapsed – 不可见且不参与布局(也适用于其子级)

隐藏- 不可见但参与布局

http://msdn.microsoft.com/en-us/library/ms590101.aspx

JavaFX 提供哪些选项?

到目前为止我的解决方案:

hBox.setManaged(false);    
  • 这项工作仅适用于 HBox,它的孩子仍然存在

root.getChildren().remove(hBoxTop);

root.getChildren().add(hBoxTop);

  • 好吧,这看起来可以工作..,但例如在 root 是 BorderPane 的情况下,一旦我删除/添加和删除 HBox,它后面的空间仍然未使用。我已经尝试过 requestLayout() 但 id 不会强制 thr rrot 填充它。我错过了什么吗?这是解决这个问题的正确方法吗?

编辑:

好吧,我得到了这个工作。

可以通过以下方式动态删除和添加此特定情况:

消除:

root.setTop(null);

添加:

root.setTop(hBoxTop);

当我在移除时没有调用 setTop(null) 时,BorderPane 仍然为 HBox 保留空间(即使在从其子项中移除之后)。

恕我直言:它不是很好的模型,因为它是特定于父容器的。例如,如果我将 BorderPane 更改为 VBox a,我也必须更改这些方法。对于 VBox,在子集合上删除/添加有效,但我需要记住索引,以便在调用 add 后 HBox 出现在同一位置。

4

1 回答 1

1

使用root.setTop(null)不是一个好主意,因为正如您所说,它特定于 BorderPane。

我认为最好的解决方案是使用:

root.getChildren().remove(yourPane);

并使用布局方法根据需要放置其他孩子。但也许您不应该首先将 BorderPane 与您希望在应用程序中的行为一起使用。

请注意,您也可以root.getChildren().clear()删除所有组件并将其再次添加到您的布局中,但有所不同。

于 2013-08-20T09:20:31.223 回答