实现效果:
实现代码:
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; } }