JavaFX的Controller之間進行通訊
阿新 • • 發佈:2019-02-02
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是全域性
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.");
}
}