JavaFX - 动态地从布局中排除/包括父级及其所有子级

时间:2012-10-18 16:03:56

标签: layout parent javafx

背景/上下文:

我有一个HBox作为父节点和许多子节点(Buttons,TextFields,Labels ...)。 HBox是其他容器的子代(BorderPane / VBox / Grid)

我的问题:

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

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

可见 - 可见并参与布局

折叠 - 不可见且不参与布局(也适用于其子女)

隐藏 - 不可见但参与布局

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

JavaFX提供哪些选项?

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

hBox.setManaged(false);    
  • 这项工作仅针对HBox,其子女仍然存在

root.getChildren()除去(hBoxTop)。

root.getChildren()添加(hBoxTop);

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

编辑:

嗯,我有这个工作。

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

删除:

root.setTop(null);

添加:

root.setTop(hBoxTop);

当我在删除时没有调用setTop(null)时,BorderPane仍为HBox保留空间(即使从子节点中删除后)。

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

1 个答案:

答案 0 :(得分:1)

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

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

root.getChildren().remove(yourPane);

并使用布局方法将您的其他孩子放置在您想要的位置。 但也许你不应该首先在你的应用程序中使用你想要的行为使用BorderPane。

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