创建静态类以在Java FXML中打开新窗口

时间:2019-04-27 19:14:00

标签: java javafx fxml

我正在一个项目中,其中有许多窗口正在打开和关闭,并且想创建一个静态类,该类只需要几个参数,其余的就做。

问题在于“控制器”将需要为不同类型的声明,具体取决于所需的控制器。例如; FXMLControllerAddFXMLControllerHome

我试图通过参数将类型传递给方法。那是行不通的,也没有使用var作为声明(它在Java11中进行了编码),因为然后我在下一行的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 个答案:

答案 0 :(得分:1)

多亏了Slaw,我才明白了。制作一个接口(例如,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){

    }
}

答案 1 :(得分:-1)

尝试让每个控制器扩展或实现父Controller类。将父控制器作为参数,并在调用方法而不是String controllerPath时将子控制器作为参数传递。