Есть ли способ сделать простое обновление сцены в JavaFX

Обновлять: В соответствии с комментарием @kleopatra.

Я хочу установить текст Button из String в TextField из другого контроллера после закрытия окна, содержащего TextField.

public class Controller {

    @FXML Button btn1;

    public void initialize(){
        renderBtns();
    }

    public void renderBtns(){

        btn1.addEventHandler(MouseEvent.MOUSE_CLICKED, new CustomButtonHandler(1));
    }
}

Я использую специальный обработчик для события Button MOUSE_CLICKED. (Имейте в виду, что это упрощенная версия моего кода, мне нужно использовать этот обработчик в полном коде)

Вот CustomButtonHandler:

   public class CustomButtonHandler implements EventHandler {

    int id;

    public CustomButtonHandler(int id){
        this.id = id;
    }

    @Override
    public void handle(Event event) {
        try {

            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(getClass().getResource("smetka.fxml"));
            Parent root = fxmlLoader.load();
            SmetkaControl controller = fxmlLoader.getController();
            controller.setId(id);
            Scene scene = new Scene(root);
            Stage stage = new Stage();
            stage.setTitle("Сметка - Маса" + " " + id);
            stage.setScene(scene);
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.setOnHiding(event1 -> {
                try {
                    controller.exitScene();
                } catch (IOException | ParseException e) {
                    e.printStackTrace();
                }
            });
            stage.show();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Вот мой другой - SmetkaControl :

public class SmetkaControl {

    int id;
    @FXML
    TextField txtField;

    public void setId(int id) {
        this.id = id;
    }

    public void initialize() {

    }

    public void exitScene() throws IOException, ParseException {

        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(getClass().getResource("sample.fxml"));
        fxmlLoader.load();
        Controller controller = fxmlLoader.getController();
        txtField.setFocusTraversable(false);
        controller.btn1.setText(txtField.getText());
        System.out.println(controller.btn1.getText());

    }
}

sample.fxml:

<?xml version = "1.0" encoding = "UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.BorderPane?>


    <BorderPane maxHeight = "-Infinity" maxWidth = "-Infinity" minHeight = "-Infinity" minWidth = "-Infinity" prefHeight = "400.0" prefWidth = "600.0" xmlns = "http://javafx.com/javafx/15.0.1" xmlns:fx = "http://javafx.com/fxml/1" fx:controller = "sample.Controller">
       <center>
          <Button fx:id = "btn1" mnemonicParsing = "false" text = "Button" BorderPane.alignment = "CENTER" />
       </center>
    </BorderPane>

и smetka.fxml:

<?xml version = "1.0" encoding = "UTF-8"?>

<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>

<HBox alignment = "CENTER" maxHeight = "-Infinity" maxWidth = "-Infinity" minHeight = "-Infinity" minWidth = "-Infinity" prefHeight = "600.0" prefWidth = "950.0" xmlns = "http://javafx.com/javafx/15.0.1" xmlns:fx = "http://javafx.com/fxml/1" fx:controller = "sample.SmetkaControl">
   <children>
      <TextField fx:id = "txtField" />
   </children>
</HBox>

По умолчанию используется Main.class:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 600, 400));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

Когда я закрываю окно, я получаю правильное значение в консоли (из btn1.getText ()), но кнопка остается неизменной.

Почему в консоли отображается правильное значение, но изображение не изменилось?

Как мне это сделать правильно?

минимальный воспроизводимый пример пожалуйста ..
kleopatra 06.04.2021 09:54

хороший стартер :) Еще не хватает: файлов fxml и приложения

kleopatra 06.04.2021 13:25

btw: вы знаете, что вы создаете новый контроллер в exitScene (который не имеет ничего общего с тем, на котором находится кнопка с обработчиком) и нигде его не используете?

kleopatra 06.04.2021 13:44

@kleopatra На самом деле я не знал, что создаю новый контроллер ... Как мне ссылаться на существующий, а не создавать новый? Я думал, что getController () дает мне существующий

Zozinski 06.04.2021 19:37
Я думал, что getController () дает мне существующий ваше предположение неверно;)
kleopatra 07.04.2021 13:06

забыл ссылки на варианты решения: см. f.i. stackoverflow.com/questions/14187963/… или stackoverflow.com/questions/32342864/applying-mvc-with-javaf‌ x

kleopatra 07.04.2021 13:46

@kleopatra Вы правы, когда я запустил stage.show () в exitScene (), он показал новый контроллер и новую сцену с правильными значениями. Я проработаю это и отправлю в качестве ответа позже

Zozinski 07.04.2021 14:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
73
0

Другие вопросы по теме