gpt4 book ai didi

JavaFX如何将新的FXML内容注入(inject)到当前场景

转载 作者:行者123 更新时间:2023-11-30 07:08:48 24 4
gpt4 key购买 nike

我有一个应用程序,其中包含带有标题和菜单的 HomeScene.fxml 文件。 HomeScene 还有仪表板 Pane ,按下菜单按钮后应动态更改。仪表板 Pane 内容应从另一个 fxml 文件加载,例如“FinancesPane.fxml”或“SettingsPane.fxml”。

我正在尝试替换 HomeController 中仪表板 Pane 的内容:

@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 。该空白区域是仪表板 Pane ,当用户按下左侧菜单按钮时应替换为其他内容。

如何动态注入(inject)该内容?

最佳答案

是的,您应该这样做以保持场景图较低,并且您将受益于更好的性能,我所做的是创建动态容器:

@FXML
private ScrollPane dynamicNode;

滚动 Pane 是一个不错的选择。

这被放入MainController。

我的主 Controller 与其他 Controller 不同,主 Controller 实际上是我初始化的唯一 Controller ,因此在您的主程序类中,无论您如何调用它:

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;
}

不要忘记创建静态访问器,我拥有的其他 Controller 通常不是这样创建的,我在 fxml 中使用 fx:controller 来指定哪个 fxml 应该使用哪个 Controller ,通常可以方便地访问 mainController 。

因此,要更改 View ,请在主 Controller 中创建连接到菜单的方法,您可以通过该方法更改 View

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

这就是我大致的做法。

因此,请将您的仪表板视为 DynamicPane,

关于JavaFX如何将新的FXML内容注入(inject)到当前场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39567836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com