Можно ли установить значение TextField в одной сцене из другой сцены, когда обе сцены отображаются? - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь заполнить TextField из сцены значением, выбранным в другой сцене.

Итак, есть сцена (я назову ее родительской сценой) с TextField и кнопка, которая открывает другуюсцена (я назову это детской сценой).Дочерняя сцена имеет TableView, выбранное значение которого я хочу установить в TextField родительской сцены.Я знаю, как это сделать, только если сцена с TextField еще не открыта, в моем случае сцена дочерней сцены устанавливается как showAndWait.Поэтому я думаю, что мне нужно получить сцену родительской сцены и установить ее в поле stage в методе select () ниже от дочернего контроллера.

// метод из дочернего контроллера, вызываемый при выборе строки из табличного представления

public void select() throws IOException
    { 
        Class class = (Class)table.getSelectionModel().getSelectedItem();
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getClassLoader().getResource("parentStage.fxml"));
        Parent parent = loader.load();
        Stage stage = // here i need to pass the parent stage I think;
        stage.initModality(Modality.APPLICATION_MODAL);
        ParentController parentController = loader.getController();


        table.setOnMouseClicked(event -> {
            if(event.getClickCount()==2){

       parentController.setTextField(new TextField(class.getValue()));

         stage.setScene(new Scene(parent));// also, 
I think, here it should be passed the already opened parent scene 
             stage.show();
            ((Node)(event.getSource())).getScene().getWindow().hide();
                }  });

// это метод для кнопки из родительской сцены, которая открывает дочернюю сцену

 public void add() throws IOException
    {
     Parent parent = FXMLLoader.load(getClass().getClassLoader().getResource("childStage.fxml"));
        stage = new Stage();
        stage.initModality(Modality.APPLICATION_MODAL);
        stageProdusNou.setScene(new Scene(parent));
        stageProdusNou.showAndWait();

    }

Спасибо.

1 Ответ

0 голосов
/ 25 мая 2019

Вы можете сделать это без необходимости перезагружать базовый макет:

  • Создание объекта из второго контроллера
  • Создайте метод во втором контроллере для инициализации переданного текстового поля локальному.
  • Передайте ваше текстовое поле второму контроллеру с созданным объектом и методом.
  • Обновите текстовое поле, когда на втором контроллере происходит действие.

Этот ответ является обобщением кодов и этапов здесь .

...