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

Yar*_*mmy 4 javafx fxml scenebuilder javafx-8

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

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

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

任何帮助将不胜感激!

mr *_*olf 5

改变场景的部分很容易。在主场景中,您放置了一个容器,您可以在其中动态加载不同的视图。以下是您对一般“静态”菜单的描述后的示例:

这是基本观点。在 中mainView,加载了不同的视图(默认为 view_a.fxml)并通过 View > Show View X 菜单进行更改。我分配给个人的 IDMenuItemFXML要加载的文件的名称。

<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>
Run Code Online (Sandbox Code Playgroud)

这是视图之一(view_a.fxml)。另一个是一样的,所以我就不展示了。在这些视图中,有趣的是我没有指定控制器,因为我后来在主框架上使用了控制器(这对小事情有好处,但对于大项目,使用不同的控制器很好)。

<AnchorPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml">
    <children>
        <Label text="View A"/>
    </children>
</AnchorPane>
Run Code Online (Sandbox Code Playgroud)

控制器本身没什么特别的。它只是将一个“.fxml”添加到所选选项的 ID,加载FXML具有结果名称的文件,并将其放在mainView中心

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)