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

我有一个应用程序,其中包含带标题和菜单的HomeScene.fxml文件。 HomeScene还有dashboardPane,应该在按下菜单按钮后动态更改。 仪表板窗格内容应该从另一个fxml文件加载,例如’FinancesPane.fxml’或’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,当用户按下左侧菜单按钮时,应该用其他内容替换。

如何动态注入此内容?

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

 @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,