JavaFX如何将新的FXML内容注入当前场景

时间:2016-09-19 07:43:45

标签: java javafx javafx-8

我有一个应用程序,其中包含带标题和菜单的HomeScene.fxml文件。 HomeScene还有dashboardPane,应该在按下菜单按钮后动态更改。仪表板窗格内容应该从另一个fxml文件加载,让我们说“FinancesPane.fxml”#39;或者' SettingsPane.fxml'。

我试图在HomeController中替换dashboardPane的内容:

@FXML
public void handleFinancesButtonAction() {
    FinancesPaneFactory paneFactory = new FinancesPaneFactory();
    dashBoardPane.getChildren().clear();
    dashBoardPane.getChildren().add(paneFactory.createPane());
}

我的FinancesPaneFactory看起来像这样:

public class FinancesPaneFactory extends PaneFactory {

    private static final String PANE_TEMPLATE_PATH = "/sceneTemplates/FinancesPane.fxml";

    public FinancesPaneFactory() {
        super(PANE_TEMPLATE_PATH );
    }

    @Override
    protected Pane generatePane(FXMLLoader loader) {
        try {
            return (Pane) loader.load();
        } catch (IOException e) {
            throw new FatBirdRuntimeException("Unable to load FinancesPane", e);
        }
    }

}

更清楚的是,这就是HomeScene的样子:HomeScene。 这个空白区域是一个dashboardPane,当用户按下左侧菜单按钮时,应该用其他内容替换。

如何动态注入此内容?

1 个答案:

答案 0 :(得分:1)

是的,你应该这样做以保持场景图低,你将从更好的性能中受益,我所做的是创建动态容器:

@FXML
private ScrollPane dynamicNode;

滚动窗格是一个不错的选择。

这是放到MainController。

我的主控制器与其他控制器不同,主控制器实际上是我初始化的唯一控制器,所以在你的主程序类中,不管你怎么称呼它:

private static MainViewController mainViewController;

...

 private static BorderPane loadMainPane() throws IOException {

        FXMLLoader loader = new FXMLLoader();
        loader.setController(mainViewController);
        BorderPane mainPane = (BorderPane) loader.load(
                CsgoRr.class
                .getResourceAsStream(Info.Resource.FXML_FILE_MAIN));
        mainPane.getStylesheets().add(CsgoRr.class.getResource("path...style.css").toString());

        return mainPane;
    }

别忘了创建静态访问器,我通常不会以这种方式创建其他控制器,我在fxml中使用fx:controller来指定哪个控制器应该是哪个fxml,它通常很方便使mainController可访问。

因此,要更改视图,请在主控制器中创建连接到您更改视图的菜单的方法

@FXML
private void setViewPreferences() {
    setView(Info.Resource.FXML_FILE_PREFERENCES);
}

@FXML
private void setViewProductPage() {
    setView(Info.Resource.FXML_FILE_PRODUCT_PAGE);
}

目前在dynamicNode中有助于查看当前选择的是什么,其

private String currentlyInDynamicPane;//not important

这是setView

   public void setView(String fxmlPath) {
         dynamicNode.setContent(getView(fxmlPath));
            currentlyInDynamicPane = fxmlPath;
   }


  public Node getView(String fxmlPath) {
        try {
            return new FXMLLoader(getClass().getResource(fxmlPath)).load();
        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        }
    }

因此,当您单击左侧菜单交换FXML文件时,您可以确保在开始时显示一些默认的FXML,或者当菜单中没有任何选项时也是如此。

这就是我粗略的做法。

所以想想你的DASHBOARD是DynamicPane,

相关问题