当前位置: 首页 > 面试题库 >

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

贺刚毅
2023-03-14
问题内容

我有一个应用程序,其中包含带有标题和菜单的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。

大概就是我这样做的方式。

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



 类似资料:
  • 我试图将一个用Swing编写的组件(它是JPanel)放入JavaFX应用程序中。我设法用这个网站上显示的代码做到了:点击这里 但是我正在使用FXML文件和场景构建器构建我的应用程序。我试图用SwingNode将Swing组件放在窗格容器中(如下图所示): 但不幸的是,我没能做到。我到处找,但在我的箱子里没有找到任何有用的东西。

  • 问题内容: 我是javaFx的新手,我只在@fxml函数和initialize函数中发现@fxml字段不为null,否则@fxml字段将始终为null,是吗?如果是这样,我如何在加载fxml之后立即使用@fxml字段(不使用lookup),就像这样?(以下代码将引发null异常) 我要做的就是在fxml中声明一个id为id的字段,并在加载fxml之后立即使用它,例如wpf,flex 问题答案: 您

  • 问题内容: 如何将JavaFX 2中图形的内容输出到。实际上,我正在开发一个基本上设计卡片的应用程序。因此,用户只需单击各种选项即可自定义场景。最后,我想将场景内容导出到图像文件。我怎么做 ? 问题答案: 为此,在FX 2.2中出现了新的快照功能。你可以说 对于较旧的FX,您可以使用AWT机械手。这不是一个很好的方法,因为它需要启动整个AWT堆栈。

  • 有人知道如何将JavaFX场景保存到可以由JavaFX FXMLLoader加载的FXML文件中吗? SceneBuilder允许这样做,但如果我手动构建场景,我如何将其保存到FXML文件中?

  • 我想从我用FXMLoader加载的场景中获取控制器。用例是: > 我的 JSON 管理器收到一个 JSON 对象 我启动的任务显示一个新的场景 在那之后,我有空旷的场景。 现在我这样做来填充组件 我的问题是,有没有更简单的方法来做到这一点?我有一个在 FXML 中指定的控制器 我想获得具有绑定值的实例(在本例中称为name的TextField) 提前谢谢

  • 我需要这段java代码的帮助。我有三个场景登录场景,管理场景,和玩家场景。当我运行程序并输入用户和密码时,第二个应该打开。现在的问题是,第二个场景没有打开。它甚至连接到数据库,但第二个场景没有打开。我已经检查了代码,我看不出有什么问题。能不能请一些帮帮我,发生了什么事。