Вы можете заставить DialogModal.showDialogModal()
возвращать контроллер появившегося модального диалогового окна.
public <T> T showDialogModal(Button root) throws IOException
{
Stage modalDialog = new Stage();
FXMLLoader loader = new FXMLLoader(getClass().getResource( fxmlURL ));
Parent modalDialogRoot = loader.load();
T controller = loader.getController(); // Retrieve the controller
Scene modalScene = new Scene( modalDialogRoot, width, height );
modalScene.getStylesheets().add(InventoryManager.class.getResource("InventoryManager.css").toExternalForm());
modalDialog.initOwner(root.getScene().getWindow());
modalDialog.setScene(modalScene);
modalDialog.setResizable(false);
// You need Platform.runLater() so that this method doesn't get blocked
Platform.runLater(() -> modalDialog.showAndWait());
return controller; // Return the controller back to caller
}
Затем в вашем методе вызова:
@FXML
private void handleModalButton(ActionEvent e) throws IOException
{
DialogModal modal = new DialogModal("Modal.fxml", 400, 450);
FooController controller = modal.showDialogModal((Button)e.getSource());
String data1 = controller.getTextField1Data();
// ...
}
Вам необходимо точно знать классконтроллера в handleModalButton()
, в противном случае вы получите ClassCastException
.Конечно, вам нужно иметь public
геттеры в контроллере, который выставляет необходимые значения.Вы можете сохранить такие вещи, как узлы и сеттеры private
.
Если у вас есть несколько методов, похожих на handleModalButton()
, и для всех них вам нужно получить аналогичный набор значений, тогда вы можете рассмотреть возможность созданияинтерфейс, который могут реализовать все ваши классы контроллера.Интерфейс будет включать методы получения, от которых вы можете получить данные.Затем showDialogModal()
может вернуть тип интерфейса, а вызывающий метод может получить ссылки на объекты контроллера через тип интерфейса.