JavaFX FXML 参数从控制器 A 传递到 B 并返回

J.O*_*ber 2 parameter-passing javafx-2 fxml

我想创建一个基于控制器的 JavaFX GUI,由多个控制器组成。

我无法完成的任务是将参数从一个场景传递到另一个场景并返回。

或者换句话说:MainController 加载 SubController 的 fxml,将一个对象传递给 SubController,切换场景。不应有两个敞开的窗户。完成工作后,SubController 应将场景切换回 MainController 并将一些对象传回。这是我失败的地方。

这个问题与这个问题非常相似,但仍然没有答案。传递参数 JavaFX FXML 评论中也提到了:

“当您将参数从第一个控制器传递到第二个控制器但如何将参数从第二个控制器传递到第一个控制器时,这项工作是在加载 first.fxml 之后。

– Xlint Xms 2017 年 9 月 18 日 23:15"

我在该线程的最佳答案中使用了第一种方法。

有没有人知道如何在没有外部库的情况下实现这一目标?

jew*_*sea 5

有很多方法可以做到这一点。

这是一个解决方案,它将消费者传递给另一个控制器。另一个控制器可以在完成工作后调用消费者来接受结果。该示例基于您链接的问题的答案中的示例代码。

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

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

  Consumer<CustomerInteractionResult> onComplete = result -> {
    // update main screen based upon result.
  };
  CustomerDialogController controller = 
    loader.<CustomerDialogController>getController();
  controller.initData(customer, onComplete);

  stage.show();

  return stage;
}

...

class CustomerDialogController() {
  @FXML private Label customerName;
  private Consumer<CustomerInteractionResult> onComplete
  void initialize() {}
  void initData(Customer customer, Consumer<CustomerInteractionResult> onComplete) {
    customerName.setText(customer.getName());
    this.onComplete = onComplete;
  }

  @FXML
  void onSomeInteractionLikeCloseDialog(ActionEvent event) {
    onComplete.accept(new CustomerInteractionResult(someDataGatheredByDialog));
  }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是将结果属性添加到对话框屏幕的控制器,感兴趣的调用者可以收听或检索结果属性。一个result属性是怎么内置的JavaFX对话框的工作,所以你将基本上是模仿一些该功能。

如果您有很多这种来回传递的东西,那么基于Gluon Ignite 之类的共享依赖注入模型可能会对您有所帮助。