本文共 2062 字,大约阅读时间需要 6 分钟。
javafx的Controller实例是由javafx框架代码自动创建并管理的,我尝试去获取javafx托管的Controller实例,但使用网上的方法,都是获取到了一个新的Controller实例,这显然是不符合要求的,那么我们可以自己创建保存管理一份Controller的引用,在使用时就能很方便获取了。
一、创建一个可以全局访问的存放Controller实例引用的容器
package com.yqsh.kit.context;import java.util.HashMap;import java.util.Map;public class Context { public static StageManager stageController = new StageManager(); public static Factory factory = new Factory(); //Controller容器 public static Mapcontrollers = new HashMap ();}
二、创建一个根控制器,作为所有的Controller的父类,在RootController的构造器中将当前实例的引用保存起来,这样每个Controller实例在创建时就会自动把自己的引用存放在我们建立的容器中,每个Controller类型的实例是唯一的
package com.yqsh.kit.controller;import com.yqsh.kit.context.Context;public class RootController { public RootController(){ //初始化时保存当前Controller实例 Context.controllers.put(this.getClass().getSimpleName(), this); }}
三、在使用时直接从容器中获取我们自己保存的Controller引用就可以实现对某个Controller函数调用和数据传递,因为Context是全局的,所以在程序任何位置都可以方便地获取想要的Controller实例
package com.yqsh.kit.controller;import com.yqsh.kit.context.Constant;import com.yqsh.kit.context.Context;import javafx.event.ActionEvent;import javafx.fxml.FXML;import javafx.scene.control.PasswordField;import javafx.scene.control.TextField;import javafx.stage.Stage;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import java.io.IOException;public class LoginController extends RootController{ @FXML private TextField userName; @FXML private PasswordField password; private Logger logger = LogManager.getLogger(this.getClass()); @FXML public void login(ActionEvent event) throws IOException { Context.factory.createStage(Constant.WINDOW_TITLE, Constant.FUNCTION_WINDOW_WIDTH, Constant.FUNCTION_WINDOW_HEIGHT, "function.fxml");; Context.stageController.jump("login", "function"); //从容器中获取FunctionController实例 FunctionController controller = (FunctionController) Context.controllers.get(FunctionController.class.getSimpleName()); //调用FunctionController的函数 controller.printlf("i was login."); }}
转载地址:http://avtlf.baihongyu.com/