我可以在不知道其父级的情况下从场景图中删除Node
吗?
换句话说,我可以这样做吗?
@FXML private ToolBar toolBar;
@FXML
protected void handleCloseButtonAction(ActionEvent actionEvent) {
toolBar.getParent().getChildrenUnmodifiable().remove(toolBar);
actionEvent.consume();
}
如果我执行此操作,则会抛出java.lang.UnsupportedOperationException
。
答案 0 :(得分:6)
您获得了UnsupportedOperationException,因为Parent#getChildrenUnmodifiable
会返回一个只读列表:
获取此Parent的子项列表作为只读列表。
如果存储父容器的引用,它总是更好更安全,但理论上你可以通过(向下)将Parent
方法返回的getParent()
对象转换为类型来实现它。父容器。
例如,如果将ToolBar
添加到VBox
:
((VBox) toolBar.getParent()).getChildren().remove(toolBar);
或者,如果您想要更通用一些,可以在返回类型检查后将返回的父项转换为Pane
,因为此类是JavaFX容器的超类,它允许修改子项列表:
if (toolBar.getParent() instanceof Pane)
((Pane) toolBar.getParent()).getChildren().remove(toolBar);
仍然,我建议存储父容器的引用,而不是遵循其中一种(或类似的)方法,因为这不是一个干净的,并且因为向下转换不是一个安全的解决方案(没有类型检查)。 / p>