• 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;
        }
    
    }
  • 相关阅读:
    小程序swiper组件实现间距轮播
    小程序form静态页面跳转
    批量添加Iconfont图标库图标
    Vant Weapp 有赞小程序UI库 ICON 组件的本地图标路径支持
    $rootScope、$apply、$watch
    EF code first 数据模型创建数据库
    angularjs directive2
    angularjs directive
    angularjs service
    angular repeat
  • 原文地址:https://www.cnblogs.com/mxh-java/p/14321301.html
Copyright © 2020-2023  润新知