JavaFX的Controller之间进行通信

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 controllers = 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.");
    }
}

你可能感兴趣的:(JavaFX)