当前位置: 首页 > 知识库问答 >
问题:

传递参数JavaFX FXML

宋斌
2023-03-14

如何在JavaFX中将参数传递给辅助窗口?有没有办法与相应的控制器进行通信

例如:用户从tableview中选择一个客户,然后打开一个新窗口,显示该客户的信息。

Stage newStage = new Stage();
try 
{
    AnchorPane page = (AnchorPane) FXMLLoader.load(HectorGestion.class.getResource(fxmlResource));
    Scene scene = new Scene(page);
    newStage.setScene(scene);
    newStage.setTitle(windowTitle);
    newStage.setResizable(isResizable);
    if(showRightAway) 
    {
        newStage.show();
    }
}

NewStage将是新窗口。问题是,我找不到一种方法告诉控制器在哪里寻找客户的信息(通过将id作为参数传递)。

有什么想法吗?

共有1个答案

宋劲
2023-03-14

推荐的方法

这个答案列举了将参数传递给FXML控制器的不同机制

对于小型应用程序,我强烈建议将参数直接从调用方传递到控制器--它简单、直接并且不需要额外的框架。

对于更大、更复杂的应用程序,如果您希望在应用程序中使用依赖注入或事件总线机制,那么值得研究一下。

将参数直接从调用方传递到控制器

自定义数据传递给FXML控制器,方法是从FXML加载器实例检索控制器,并调用控制器上的方法以使用所需的数据值初始化该控制器。

public Stage showCustomerDialog(Customer customer) {
  FXMLLoader loader = new FXMLLoader(
    getClass().getResource(
      "customerDialog.fxml"
    )
  );

  Stage stage = new Stage(StageStyle.DECORATED);
  stage.setScene(
    new Scene(loader.load())
  );

  CustomerDialogController controller = loader.getController();
  controller.initData(customer);

  stage.show();

  return stage;
}

...

class CustomerDialogController {
  @FXML private Label customerName;
  void initialize() {}
  void initData(Customer customer) {
    customerName.setText(customer.getName());
  }
}
new FXMLLoader(getClass().getResource("sample.fxml"));

注意不要在FXMLLoader上使用静态加载函数,否则您将无法从您的加载器实例获取您的控制器。

FXMLLoader实例本身从不了解域对象的任何信息。您不直接将特定于应用程序的域对象传递到FXMLLoader构造函数中,而是:

  1. 在指定位置基于fxml标记构造FXMLLoader
  2. 从FXMLLoader实例获取控制器。
  3. 调用检索到的控制器上的方法,为控制器提供对域对象的引用。
CustomerDialogController dialogController = 
    new CustomerDialogController(param1, param2);

FXMLLoader loader = new FXMLLoader(
    getClass().getResource(
        "customerDialog.fxml"
    )
);
loader.setController(dialogController);

Pane mainPane = loader.load();

您可以在代码中构造一个新的控制器,将您想要的任何参数从调用方传递到控制器构造函数中。构造了控制器之后,可以在调用load()实例方法之前在FXMLLoader实例上设置该控制器。

要在加载器上设置控制器(在JavaFX2.x中),还不能在fxml文件中定义fx:controller属性。

由于FXML中fx:controller定义的限制,我个人更喜欢从FXMLLoader获取控制器,而不是将控制器设置到FXMLLoader中。

使控制器从外部静态方法检索参数

Sergey在controller.java文件中对JavaFX2.0How-to application.getParameters()的回答就是这个方法的例子。

使用依赖注入

    null

Afterburner.fx框架和一个使用它的示例air-hacks应用程序就是一个非常好的、干净的依赖注入方法的例子。fx依赖于JEE6 javax.inject来执行依赖注入。

使用事件总线

Greg Brown是FXML规范的创建者和实现者,他经常建议考虑使用事件总线(如Guava EventBus),用于FXML实例化控制器和其他应用程序逻辑之间的通信。

EventBus是一个简单但功能强大的发布/订阅API,带有注释,允许POJO在JVM中的任何地方相互通信,而不必相互引用。

后续问答

第一种方法,你为什么要返回阶段?该方法也可能是空的,因为您已经给出了命令show();在返回阶段之前;。如何通过返回舞台来计划使用

Spring Boot依赖注入示例

关于如何以“Spring Boot方式”来实现的问题,有一个关于JavaFX2的讨论,我在附带的Permalink中提到了这个问题。该方法仍然有效,并于2016年3月在Spring Boot V1.3.3上进行了测试。发行版:https://stackoverflow.com/A/36310391/1281217

有时,您可能希望将结果传递回调用方,在这种情况下,您可以查看相关问题的答案:

    null
 类似资料:
  • 您可以将其他数据作为常规方法参数传递到后台任务。我再次使用下面的例子(希望没有让你厌恶): BackgroundJob.Enqueue(() => Console.WriteLine("Hello, {0}!", "world")); 在常规方法调用中,在执行后台作业期间, Console.WriteLine 方法将使用这些参数。为了参数传递进去,需要先序列化。 使用 了不起的 Newtonsof

  • 尽管应用中的大部分组件都依赖其他组件,但并不总是如此。同时 Windsor 用来查找满足依赖的正确组件的默认规则有时不得不进行调整。 如何做到这一点基于值的来源和获取值的地方。 Composition root - container.Resolve container.Resolve 方法有几个重载允许传递 IDictionary 作为参数(在这种情况下,建议使用 [Arguments] 类),

  • 问题内容: 如何将参数传递给javafx中的辅助窗口?有没有办法与相应的控制器通信? 例如:用户从中选择一个客户,TableView然后会打开一个新窗口,显示该客户的信息。 newStage将是新窗口。问题是,我找不到告诉控制器在哪里寻找客户信息的方法(通过将id作为参数传递)。 有任何想法吗? 问题答案: 推荐方法 该答案列举了将参数传递给FXML控制器的不同机制。 对于小型应用程序,我强烈建议

  • 问题内容: 这是我的 angularroute.html Route.js文件包含。 Route1.html 问题是它加载了页面,但我无法在route1.html上接收到获取参数值,表达式也未得到求值。可能是什么问题呢?谢谢。 问题答案: 从路线模板中删除不需要的所有内容。只需要您在模板正文中添加的内容。 这将包含在您在路线中配置的控制器的ng-view中。这是部分而不是完整的html文件。 另外

  • 我在MYSQL服务器上的y db中有一个存储过程。当我试图调用它时,它给出了错误: 通用域名格式。mysql。jdbc。例外。jdbc4。MySQLSyntaxErrorException:过程thu的参数数量不正确。生产者;预期为2,在组织中为0。springframework。jdbc。支持SQLExceptionSubclassTranslator。doTranslate(SQLExcept

  • 我是新手。有人能解释一下这个代码吗 公开课演示2{ } 结果打印出1,2,3,4,5和10,15,5,3