在不知道父节点的情况下删除节点(JavaFX)

时间:2016-07-15 10:33:31

标签: java javafx fxml

我可以在不知道其父级的情况下从场景图中删除Node吗?

换句话说,我可以这样做吗?

@FXML private ToolBar toolBar;

@FXML
protected void handleCloseButtonAction(ActionEvent actionEvent) {
    toolBar.getParent().getChildrenUnmodifiable().remove(toolBar);

    actionEvent.consume();
}

如果我执行此操作,则会抛出java.lang.UnsupportedOperationException

1 个答案:

答案 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>