我正在一个项目中,其中有许多窗口正在打开和关闭,并且想创建一个静态类,该类只需要几个参数,其余的就做。
问题在于“控制器”将需要为不同类型的声明,具体取决于所需的控制器。例如; FXMLControllerAdd
或FXMLControllerHome
。
我试图通过参数将类型传递给方法。那是行不通的,也没有使用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();
}
}
也;是否存在另一种需要较少参数的方式?
答案 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
时将子控制器作为参数传递。