我有一个应用程序,其中包含带标题和菜单的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,当用户按下左侧菜单按钮时,应该用其他内容替换。
如何动态注入此内容?
答案 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,