layout - JavaFX – 从布局中动态排除/包含父项及其所有子项

标签 layout parent javafx

背景/语境:

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

我的问题:

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

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

Visible – 可见并参与布局

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

隐藏 – 不可见但参与布局

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

JavaFX 提供哪些选项?

我目前的解决方案:

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

root.getChildren().remove(hBoxTop);

root.getChildren().add(hBoxTop);

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

已编辑:

好吧,我成功了。

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

移除:

root.setTop(null);

添加:

root.setTop(hBoxTop);

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

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

最佳答案

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

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

root.getChildren().remove(yourPane);

并使用布局方法根据需要放置其他 child 。 但也许您一开始就不应该在应用程序中使用 BorderPane 来实现您想要的行为。

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

关于layout - JavaFX – 从布局中动态排除/包含父项及其所有子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12958898/

相关文章:

css - 具有第一列动态宽度的 3 列 div

javascript - 弹出窗口如何更改其父跨域的页面位置?

java - FXML:在水平框(HBox)内定位多个元素

javascript - 获取包含div的ID以传入jeditable jquery

java - 如何通过 ListChangeListener 检索 ObservableList 中的更改项

java - 如何在线程和 GUI 之间进行通信

android - 如何在横向布局中包含纵向布局?

JavaFX:与文本具有相同宽度和大小的按钮

css - 相对于静态容器的动态大小容器

c++ - Qt:强制子窗口有自己的任务栏条目