Обновление элемента в окне при многократном открытии

Рейтинг: -1Ответов: 1Опубликовано: 19.06.2023

Случилась проблема, с которой не могу справится.
Есть некое окно оплаты товара, которое при получении значения canPay включает разные панели.
Проблема следующая, что при повторном открытии этого окна, панели не реагируют на команды setVisible(true), но код при этом выполняется.
После оплаты, пользователь нажимает на кнопку возвращения на главное меню, затем следующий пользователь выбирает товар, жмёт оплату и при повторе не срабатывает обновление панелей

@FXML 
void onBack(ActionEvent event) throws IOException, SerialPortException {
    FXMLLoader loader = new FXMLLoader(Main.class.getResource("trade-view.fxml"));
    Parent root = loader.load();
    Stage stage = new Stage();
    stage.setTitle("FreedaFreeze!");
    stage.setScene(new Scene(root));
    stage.show();

    Stage stageResult = (Stage) backToMenu.getScene().getWindow();
    stageResult.close();

    getClose();
}

Метод вызова окна:

@FXML
void onPay(ActionEvent event) throws IOException {
    ((Stage) payBtn.getScene().getWindow()).close();

    FXMLLoader loader = new FXMLLoader(Main.class.getResource("result-view.fxml"));
    loader.load();
    Parent root = loader.getRoot();
    Stage stage = new Stage();
    stage.setTitle("FreedaFreeze!");
    stage.setScene(new Scene(root));
    stage.showAndWait();
}

Значения при выходе все обнуляю. Ничего не получается. Компиляцию делаю в IDE. Попробовал собрать банку, история та же самая, первый раз - работает, последующие разы - нет.

Ответы

▲ 0Принят

Наиболее простым и адекватным решением в данном случае выделяю следующий вариант.
Создаём два дополнительных контроллера, один на успешную оплату, второй на ошибку, затем вызываем их из результирующего окна, закрывая результат.

Вызываем следующим образом: *на примере ошибки*

private void getError() throws IOException, SerialPortException {
    getClose();
    Platform.runLater(() -> {
        Stage stageResult = (Stage) cardPane.getScene().getWindow();
        stageResult.close();
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource("error-view.fxml"));
            Scene scene = new Scene(fxmlLoader.load());
            Stage stage = new Stage();
            stage.setTitle("FreedaFreeze!");
            stage.setScene(scene);
            stage.show();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    });
}

Очень важно обнулить все предыдущие значения, которые задаются при выполнении классов.