如何从另一个控制器访问FXML方法并减少代码冗余
解决方案
方案1:抽取静态工具类(实现成本最低)
将通用退出逻辑封装到独立的工具类中,两个控制器直接调用即可,不需要修改原有控制器的结构。
工具类代码:
public class AppCommonUtil { public static void exitApplication() { System.out.println("Goodbye " + System.getProperty("user.name")); System.exit(0); } }
修改后两个控制器的代码统一简化为:
@FXML private void onExitButtonClick() { AppCommonUtil.exitApplication(); }
适用场景:仅少量通用逻辑、控制器不需要共享其他属性或方法的情况
方案2:基类控制器继承(代码冗余度最低)
抽象出公共父控制器,把公共的FXML交互方法直接定义在父类中,子类控制器继承后无需重复编写对应方法。
父控制器代码:
public class BaseController { @FXML protected void onExitButtonClick() { System.out.println("Goodbye " + System.getProperty("user.name")); System.exit(0); } }
两个业务控制器直接继承基类即可,不需要再写退出按钮的点击方法:
// MenuController.java public class MenuController extends BaseController { // 仅编写菜单场景独有的业务逻辑 }
// GameOverController.java public class GameOverController extends BaseController { // 仅编写GameOver场景独有的业务逻辑 }
注意:需要保证两个FXML文件中退出按钮的onAction属性都绑定为onExitButtonClick,FXMLLoader会自动匹配父类的@FXML注解方法
适用场景:多个控制器存在大量通用交互逻辑、需要共享属性或通用方法的场景
方案3:全局事件绑定(无需修改控制器代码)
如果不想调整现有控制器的继承结构或代码,也可以在场景加载时统一给所有退出按钮绑定公共事件逻辑,不过这种方案耦合度相对较高,适合临时批量添加通用逻辑的场景。
内容的提问来源于stack exchange,提问作者Cheang Wai Bin
相关产品推荐
相关产品推荐

