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 Map<String, Object> controllers = new HashMap<String, Object>();
}
- 创建一个根控制器,作为所有的Controller的父类,在RootController的构造器中将当前实例的引用保存起来,这样每个Controller实例在创建时就会自动把自己的引用存放在我们建立的容器中,每个Controller类型的实例是唯一的
package com.yqsh.kit.controller;
import com.yqsh.kit.context.Context;
public class RootController {
public RootController(){
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.");
}
}