我有一个应用程序,其中包含带有标题和菜单的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代码的帮助。我有三个场景登录场景,管理场景,和玩家场景。当我运行程序并输入用户和密码时,第二个应该打开。现在的问题是,第二个场景没有打开。它甚至连接到数据库,但第二个场景没有打开。我已经检查了代码,我看不出有什么问题。能不能请一些帮帮我,发生了什么事。