Создание статического класса для открытия нового окна в Java FXML - PullRequest
0 голосов
/ 27 апреля 2019

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

Проблема в том, что для «контроллера» должны быть различные типы объявлений, в зависимости от того, какой контроллер нужен. Например; FXMLControllerAdd или FXMLControllerHome.

Я пытался передать тип в метод с параметром. Это не сработало, равно как и с использованием var в качестве объявления (оно написано на Java11), потому что тогда я получил ошибку «not find symbol» для initData () на следующей строке.

public static void nySide(Class c, String controllerPath, Dataset dataset, String tittel, Window window) {
    try {
        FXMLLoader loader = new FXMLLoader(c.getResource(controllerPath));
        Parent root = (Parent) loader.load();

        //THIS IS WHERE TO PROBLEM IS
        FXMLControllerAdd controller = loader.getController();
        controller.initData(dataset);

        //This line gets the Stage information
        Stage st = new Stage();
        st.setTitle(tittel);
        st.setScene(new Scene(root));

        st.show();

        Stage stage = (Stage) window;
        stage.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Также; существует ли другой способ, который требует меньше параметров?

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Я понял это благодаря Славу. Создание интерфейса E.g (FXMLInitData) и его реализация в каждом FXMLController.java и объявление контроллера в качестве этого интерфейса сделали свое дело.

Интерфейс:

public interface FXMLInitData {

    public void initData(Dataset dataset);

}

Метод:

public static void nySide(Class c, String controllerPath, Dataset dataset, String tittel, Window window){
    try {
        FXMLLoader loader = new FXMLLoader(c.getResource(controllerPath));
        Parent root = (Parent) loader.load();

        FXMLInitData controller = loader.getController();
        controller.initData(dataset);

        //This line gets the Stage information
        Stage st = new Stage();
        st.setTitle(tittel);
        st.setScene(new Scene(root));

        st.show();

        Stage stage = (Stage) window;
        stage.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Класс:

public class FXMLControllerHome implements Initializable, FXMLInitData{
    @Override
    public void initData(Dataset dataset){

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

Попробуйте позволить каждому контроллеру расширять или реализовывать родительский класс Controller.Сделайте родительский Контроллер параметром и передайте дочерний контроллер как параметр при вызове метода вместо String controllerPath.

...