JavaFX/SceneBuilder-仅更改场景的一部分

JavaFX/SceneBuilder-仅更改场景的一部分,javafx,javafx-8,fxml,scenebuilder,Javafx,Javafx 8,Fxml,Scenebuilder,我对JavaFX完全是个新手,我还没有找到任何关于这个问题的教程/答案 所以基本上我想做的是只改变我场景的一部分。我想在顶部保留一个静态菜单栏,只根据正在单击的菜单按钮更改底部。这意味着每个“页面”都需要不同的FXML文件和控制器类 查看可用的JavaFX特性,我认为SubScene可以完成这项工作。但经过进一步的调查,子场景似乎是为3D制作的?所以我真的不知道我该做什么 任何帮助都将不胜感激 更改场景的各个部分很容易。在主场景中,放置一个容器,在其中动态加载不同的视图。下面是您描述的通用“静态

我对JavaFX完全是个新手,我还没有找到任何关于这个问题的教程/答案

所以基本上我想做的是只改变我场景的一部分。我想在顶部保留一个静态菜单栏,只根据正在单击的菜单按钮更改底部。这意味着每个“页面”都需要不同的FXML文件和控制器类

查看可用的JavaFX特性,我认为SubScene可以完成这项工作。但经过进一步的调查,子场景似乎是为3D制作的?所以我真的不知道我该做什么


任何帮助都将不胜感激

更改场景的各个部分很容易。在主场景中,放置一个容器,在其中动态加载不同的视图。下面是您描述的通用“静态”菜单示例:

这是基本观点。在
mainView
中,将加载不同的视图(默认为view_a.fxml)并从view>Show view X菜单进行更改。我分配给单个
MenuItem
的ID是要加载的
FXML
文件的名称

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
    <top>
        <MenuBar BorderPane.alignment="CENTER">
            <menus>
                <Menu mnemonicParsing="false" text="File">
                    <items>
                        <MenuItem mnemonicParsing="false" text="Close" />
                    </items>
                </Menu>
                <Menu mnemonicParsing="false" text="View">
                    <items>
                        <MenuItem fx:id="view_a" mnemonicParsing="false" text="Show View A" onAction="#handleChangeView"/>
                        <MenuItem fx:id="view_b" mnemonicParsing="false" text="Show View B" onAction="#handleChangeView"/>
                    </items>
                </Menu>
            </menus>
        </MenuBar>
    </top>
    <center>
        <BorderPane fx:id="mainView">
            <center>
                <fx:include source="view_a.fxml"/>
            </center>
        </BorderPane>
    </center>
</BorderPane>

在这种情况下可能有用。@SedrickJefferson,但这不需要我手动删除并添加BorderPane的子项吗?我正在搜索一个“子场景”,在那里我可以调用一些方法,比如.setRoot()附加SceneBuilder生成的FXML文件。@M.Benamar:
SubScene.setRoot
BorderPane.setCenter
在复杂性方面应该没有太大区别。如果我想使用单独的控制器,我如何在loader.setController()中传递适当的控制器;行?@user3317592,单独的查看器控制器?您根本不需要提供控制器。只需在
视图\u a.fxml
视图\u b.fxml
视图中声明控制器即可。最后,你可能会考虑回主舞台控制器,我早就意识到了!谢谢:)同样通过回拨到主控制器,您的意思是以某种方式将其作为参数传递给其他控制器吗?我想我们这样做是为了访问主控制器的方法?@user3317592是的,不同的控制器相互通信是很常见的。在上面的语句中,您可以使用
loader.getController()
来获取新的查看器控制器以注入所需的数据。
<AnchorPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml">
    <children>
        <Label text="View A"/>
    </children>
</AnchorPane>
public class Controller {
    @FXML
    private BorderPane mainView;

    @FXML
    private void handleChangeView(ActionEvent event) {
        try {
            String menuItemID = ((MenuItem) event.getSource()).getId();

            FXMLLoader loader = new FXMLLoader(getClass().getResource(menuItemID + ".fxml"));
            loader.setController(this);

            mainView.setCenter(loader.load());
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}