JavaFx之在当前界面打开另一个界面

实现效果:

实现代码:

FxmlController:

    /**
     * 添加数据
     * @param actionEvent
     */
    @FXML
    public void addData(ActionEvent actionEvent) {
        // 打开新的场景需要UI更新线程执行
        Platform.runLater(()->{
            Stage saveDiary = StageManager.getStage("saveDiary");
            // 每次创建场景前,判断该场景是否被创建过,创建过直接显示场景即可,无需多次创建,但是需要清除上次输入的数据
            if(Objects.isNull(saveDiary)) {
                try {
                    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/saveDiary.fxml"));
                    Parent pane = (Parent)fxmlLoader.load();
                    Scene scene = new Scene(pane);
                    Stage stage = new Stage();
                    stage.setScene(scene);
                    stage.setTitle("添加数据");
                    stage.initStyle(StageStyle.TRANSPARENT);
                    stage.show();
                    // 存放Scene
                    StageManager.put("saveDiary", stage);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                saveDiary.show();
            }
        });
    }

加载resources/fxml路径下的fxml文件,创建Stage,并且显示出来,把Stage放入全局Stage管理器方便其他页面关闭该Stage;

StageManager:

import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 场景管理器
 */
public class StageManager {

    /**
     * 场景集合
     */
    private static Map<String, Stage> stageMap = new ConcurrentHashMap<>();

    /**
     * 根据key存放Scene
     * @param key
     * @param stage
     */
    public static void put(String key, Stage stage) {
        if(StringUtils.isEmpty(key)) {
            throw new RuntimeException("key不为空!");
        }
        if(Objects.isNull(stage)) {
            throw new RuntimeException("scene不为空!");
        }
        stageMap.put(key, stage);
    }

    /**
     * 根据key获取Scene
     * @param key
     * @return
     */
    public static Stage getStage(String key) {
        if(StringUtils.isEmpty(key)) {
            throw new RuntimeException("key不为空!");
        }
        return stageMap.get(key);
    }

}

管理全局的Stage,扩大Stage作用域,方便Stage在其他页面关闭;

关闭场景方法:

    /**
     * 关闭当前场景
     * @param actionEvent
     */
    @FXML
    public void cancel(ActionEvent actionEvent) {
        Stage stage = StageManager.getStage("saveDiary");
        logger.info("stage: {}",stage);
        if(!Objects.isNull(stage)) {
            stage.close();
            logger.info("关闭场景成功!");
        }
    }

根据要关闭界面的key拿到Stage,调用close方法关闭该Stage;

效果图:

关于多界面参数传递问题:

解决思路:可以使用全局变量,根据界面名称、参数名称将参数放到公共内存里,需要的时候去获取即可;

代码实现:

import java.util.HashMap;
import java.util.Map;

/**
 * 参数管理器
 */
public class ParamManager {

    // 页面参数集合
    private static Map<String, Map<String, Object>> paramMap = new HashMap<>();

    /**
     * 根据pageName,key存放value
     * @param pageName
     * @param key
     * @param value
     */
    public static void putParam(String pageName, String key, Object value) {
        Map<String, Object> pageMap = paramMap.get(pageName);
        if(null == pageMap) {
            Map<String, Object> page = new HashMap<>();
            page.put(key, value);
            paramMap.put(pageName, page);
        } else {
            pageMap.put(key, value);
            paramMap.put(pageName, pageMap);
        }
    }

    /**
     * 根据pageName,key获取value
     * @param pageName
     * @param key
     * @return
     */
    public static Object getParam(String pageName, String key) {
        Map<String, Object> pageMap = paramMap.get(pageName);
        if(null == pageMap) {
            return null;
        }
        Object value = pageMap.get(key);
        return value;
    }

}
原文地址:https://www.cnblogs.com/mxh-java/p/14321301.html