从 FXML 添加锚窗格并将其交换到当前场景

Adding an anchorpane from FXML and swapping it into current scene

我正在处理的项目中遇到了一些问题。我希望将我的 fxml 内容加载到现有锚定窗格中并在单击 "next" 按钮时显示它,我还希望使用 "back" 按钮将锚定窗格设置为上一个 fxml 文件。

我遇到的问题是它只工作了一次。如果单击下一步,它会显示正确的 fxml 内容,但是如果按下后退,它会正确运行一次,第二次显示的 window 不包含任何内容:

@FXML
AnchorPane scenePane, allContent;

@FXML
public void handleNextAction() {
    try {
        scenePane.getChildren().clear();
        AnchorPane newvalscene = (AnchorPane) FXMLLoader.load(getClass().getResource("ProjectDetails.fxml"));
        scenePane.getChildren().setAll(newvalscene.getChildren());
    } catch (IOException ex) {
        Logger.getLogger(NewProjectController.class.getName()).log(Level.SEVERE, null, ex);
    }
}


@FXML
public void handleBackAction() {
    try {
       // allContent.getChildren().clear();
        AnchorPane newvalscene = (AnchorPane) FXMLLoader.load(getClass().getResource("newProjectWindow.fxml"));
        allContent.getChildren().setAll(newvalscene.getChildren());
    } catch (IOException ex) {
        Logger.getLogger(NewProjectController.class.getName()).log(Level.SEVERE, null, ex);
    }
}

我已经尝试清除锚窗格的内容,但这只会导致锚窗格为空,第二次按下后退按钮时没有从 FXML 加载任何内容。

注意我试过调试这个但是因为没有实际错误很难追踪而且 netbeans 似乎不会向我显示包含所有要渲染节点的变量 newvalscene 的内容,但是 println 显示它确实包含我希望显示的 Vbox 和子项。

如有任何帮助,我们将不胜感激。

为什么所有这些 SIr 都是有原因的?

scenePane.getChildren().clear();
scenePane.getChildren().setAll(newvalscene.getChildren());//why replace?

allContent.getChildren().setAll(newvalscene.getChildren());//why replace ?

请试试这个

如果你真的有这个

AnchorPane scenePane, allContent;

scenePane 是您的 Parent 或 Root,您可以像

这样嵌套项目
scenePane.getCHildren().add(child);

与您的代码有关

AnchorPane nextvalscene,backvalscene;

public void handleNextAction() {
try {
    //scenePane.getChildren().clear(); remove this
    if(nextvalscene == null){
    nextvalscene = (AnchorPane) FXMLLoader.load(getClass().getResource("ProjectDetails.fxml"));
    scenePane.getChildren().add(newvalscene);//change setAll to add and use the child itself
    AnchorPane.setLeftNode(newvalscene, 0.0);//set constraint for your newvalscene AnchorPane
    //do that for the rest esp top
    }
    nextvalscene.toFront();
} catch (IOException ex) {
    Logger.getLogger(NewProjectController.class.getName()).log(Level.SEVERE, null, ex);
}
}

对 handleBackAction 做同样的事情

Logic 是你的 parent 或根场景是 AnchorPane 它可以包含 children,所以不需要替换它的所有 children,你可以通过约束将它们全部隐藏起来在布局参数上,并更改其 re-ordering.

除非你有理由将你的 Anchorpane 的 children 复制到你的场景 children 列表,我想我错过了

希望对您有所帮助