Почему метод, вызванный из другого контроллера, не меняет сцену? - PullRequest
0 голосов
/ 19 апреля 2019

Я получил сцену first.fxml с firstController, это BorderPane с одной кнопкой (birthCert) в левой части.

Когда я нажимаю кнопку (birthCert), я успешно загружаю second.fxml в центр BorderPane.

    @FXML
    void birthCert(ActionEvent event) {

        Parent root;
        try {
            root = load(getClass().getResource("second.fxml"));
            id_borderPane.setCenter(root);

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

    }

second.fxml связан с классом secondController и имеет 1 кнопку (sendRequest). Когда эта кнопка нажата, я создаю экземпляр firstController и хочу, чтобы метод метода setscene загружал третий.fxml в центр borderPane.

third.fxml показывает только сообщение «Ваш запрос отправлен».

Проблема в том, что когда я вызываю метод setscene в классе secondController с экземпляром firstController

c.setscene();
 public void setscene() {
        Parent root;
        try {
            root = load(getClass().getResource("third.fxml"));
            id_borderPane.setCenter(root);

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

он не загружает third.fxml в центр BorderPane, ничего не происходит, только second.fxml остается загруженным.

Я пробовал контрольную печать и проверил, имеет ли root значение null, но печать работает нормально, а root не равен null, поэтому я действительно не понимаю, что может привести к тому, что в центре BorderPane не отображается Third.fxml

Вот весь код:

package controllers;

import static javafx.fxml.FXMLLoader.load;
import java.io.IOException;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;

public class firstController {

    @FXML
    private BorderPane id_borderPane;

    @FXML
    void birthCert(ActionEvent event) {

        Parent root;
        try {
            root = load(getClass().getResource("second.fxml"));
            id_borderPane.setCenter(root);

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

    }

    public void setscene() {
        Parent root;
        try {
            root = load(getClass().getResource("third.fxml"));
            id_borderPane.setCenter(root);

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

}
package controllers;

import java.io.IOException;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.TextArea;
import javafx.scene.input.MouseEvent;

public class secondController{

    @FXML
    void SendRequset(MouseEvent event) throws IOException  {

        FXMLLoader loader = new FXMLLoader(getClass().getResource("first.fxml"));
        loader.load();
        UserGUISendReqController c = loader.getController(); // instance of firstController
        c.setscene();
    }
}

Большое спасибо за помощь :)

1 Ответ

0 голосов
/ 22 апреля 2019

У вас есть:

FirstController
|- SecondController

Затем во втором контроллере вы нажимаете кнопку, чтобы добавить третий контроллер, который вы делаете

FirstController
|- SecondController
   |- new FirstController.setScene()

Вы должны создать экземпляр нового FirstController, вы должны либо вызвать родителя SecondController, либо как-то передать ссылки на FirstController во второй контроллер.

Вы хотите использовать getParent для SecondController или какой-либо другой метод передачи активного FirstController во SecondController, чтобы при его вызове он был правильным.

пс. Люди также прокомментируют ваше соглашение об именах, не соответствующее стандартам.

...