1. 程式人生 > >JavaFX的Controller之間進行通訊

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