package com.zzg.mybatis.generator.controller; import java.io.IOException; import java.lang.ref.SoftReference; import java.net.URL; import java.util.HashMap; import java.util.Map; import com.zzg.mybatis.generator.view.AlertUtil; import javafx.scene.Scene; import javafx.stage.Modality; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.Parent; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public abstract class BaseFXController implements Initializable { private static final Logger _LOG = LoggerFactory.getLogger(BaseFXController.class); private Stage primaryStage; private Stage dialogStage; private static Map<FXMLPage, SoftReference<? extends BaseFXController>> cacheNodeMap = new HashMap<>(); public BaseFXController loadFXMLPage(String title, FXMLPage fxmlPage, boolean cache) { SoftReference<? extends BaseFXController> 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(); BaseFXController controller = loader.getController(); dialogStage = new Stage(); dialogStage.setTitle(title); dialogStage.initModality(Modality.APPLICATION_MODAL); dialogStage.initOwner(getPrimaryStage()); dialogStage.setScene(new Scene(loginNode)); dialogStage.setMaximized(false); dialogStage.setResizable(false); dialogStage.show(); controller.setDialogStage(dialogStage); // put into cache map SoftReference<BaseFXController> softReference = new SoftReference<>(controller); cacheNodeMap.put(fxmlPage, softReference); return controller; } catch (IOException e) { _LOG.error(e.getMessage(), 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(); } } }