JavaFX: получение данных из модальных загрузок во время выполнения - PullRequest
0 голосов
/ 06 июня 2018

У меня есть модальный класс:

public class DialogModal
{
    private String fxmlURL;
    private int width;
    private int height;

    public DialogModal( String url, int w, int h )
    {
        fxmlURL = url;
        width = w;
        height = h;
    }

    public void showDialogModal(Button root) throws IOException
    {
        Stage modalDialog = new Stage();
        FXMLLoader loader = new FXMLLoader(getClass().getResource( fxmlURL ));
        Parent modalDialogRoot = loader.load();
        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);
        modalDialog.showAndWait();
    }
}

, который затем открывается таким образом (из контроллера FXML):

    @FXML
    private void handleModalButton(ActionEvent e) throws IOException
    {
        DialogModal modal = new DialogModal("Modal.fxml", 400, 450);
        modal.showDialogModal((Button)e.getSource());
    }

Мой вопрос: как мне получить данные измодальный (т. е. TextFields) вернуться к моему handleModalButton методу?Этому модалу могут быть присвоены разные файлы FXML, поэтому возвращаемые им данные могут отличаться.

Кроме того, как (или должен) я отправлять данные на модальные (например, для заполнения TextFields)?

Спасибо!

1 Ответ

0 голосов
/ 06 июня 2018

Вы можете заставить 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() может вернуть тип интерфейса, а вызывающий метод может получить ссылки на объекты контроллера через тип интерфейса.

...