【问题标题】:JavaFX how to inject new FXML content to current SceneJavaFX 如何向当前场景注入新的 FXML 内容
【发布时间】:2016-09-19 07:43:44
【问题描述】:

我有一个应用程序,其中包含带有标题和菜单的 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,当用户按下左侧菜单按钮时应该用另一个内容替换。

如何动态注入这些内容?

【问题讨论】:

  • dashBoardPane 是 BorderPane?如果是,您应该使用类似 dashBoardPane.setCenter(pane) 的方法
  • dashBoardPane 是一个 AnchorPane。

标签: java javafx javafx-8


【解决方案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。

这就是我大致的做法。

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

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2012-04-23
    • 2022-11-09
    • 1970-01-01
    • 2016-03-25
    相关资源
    最近更新 更多