JavaFX的Controller之间进行通信

xiaoxiao2021-03-01  11

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(){ //初始化时保存当前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."); } }
转载请注明原文地址: https://www.6miu.com/read-3100173.html

最新回复(0)