package com.szmirren.controller; import java.io.IOException; import java.lang.ref.SoftReference; import java.net.URL; import java.util.HashMap; import java.util.Map; import com.szmirren.view.AlertUtil; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.stage.Modality; import javafx.stage.Stage; public abstract class BaseController implements Initializable { private Stage primaryStage; private Stage dialogStage; private static Map<FXMLPage, SoftReference<? extends BaseController>> cacheNodeMap = new HashMap<>(); /** * 加载一个页面 * * @param title * 页面标题 * @param fxmlPage * 页面FXML路径 * @param cache * 是否换缓存 * @return */ public BaseController loadFXMLPage(String title, FXMLPage fxmlPage, boolean cache) { return loadFXMLPage(title, fxmlPage, true, cache); } /** * 加载一个页面 * * @param title * 页面标题 * @param fxmlPage * 页面FXML路径 * @param resize * 是否可以窗口最大化 * @param cache * 是否换缓存 * @return */ public BaseController loadFXMLPage(String title, FXMLPage fxmlPage, boolean resize, boolean cache) { SoftReference<? extends BaseController> parentNodeRef = cacheNodeMap.get(fxmlPage); if (cache && parentNodeRef != null) { return parentNodeRef.get(); } URL skeletonResource = Thread.currentThread().getContextClassLoader().getResource(fxmlPage.getFxml()); FXMLLoader loader = new FXMLLoader(skeletonResource); Parent loginNode; try { loginNode = loader.load(); BaseController controller = loader.getController(); dialogStage = new Stage(); dialogStage.setTitle(title); dialogStage.getIcons().add(new Image("image/icon.png")); dialogStage.initModality(Modality.APPLICATION_MODAL); dialogStage.initOwner(getPrimaryStage()); dialogStage.setScene(new Scene(loginNode)); dialogStage.setMaximized(false); dialogStage.setResizable(resize); dialogStage.show(); controller.setDialogStage(dialogStage); SoftReference<BaseController> softReference = new SoftReference<>(controller); cacheNodeMap.put(fxmlPage, softReference); return controller; } catch (IOException e) { AlertUtil.showErrorAlert(e.getMessage()); } return null; } public Stage getPrimaryStage() { return primaryStage; } public void setPrimaryStage(Stage primaryStage) { this.primaryStage = primaryStage; } public Stage getDialogStage() { return dialogStage; } public void setDialogStage(Stage dialogStage) { this.dialogStage = dialogStage; } public void showDialogStage() { if (dialogStage != null) { dialogStage.show(); } } public void closeDialogStage() { if (dialogStage != null) { dialogStage.close(); } } public void closeDialogStageByMap(FXMLPage fxmlPage) { if (cacheNodeMap.get(fxmlPage).get().getDialogStage() != null) { cacheNodeMap.get(fxmlPage).get().getDialogStage().close(); } } }