From 3ab4c4f77e955b371148b1f136cca7a104b2ce41 Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Wed, 20 Sep 2023 19:20:19 +0800 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20=E9=87=8D=E6=9E=84LunchApp=EF=BC=8C?= =?UTF-8?q?=E5=B0=86=E5=BA=94=E7=94=A8=E8=B5=84=E6=BA=90=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E4=B8=8E=E5=88=9D=E5=A7=8B=E5=8C=96=E4=B8=8E=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E7=B1=BB=E5=89=A5=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/jcnc/jnotepad/LunchApp.java | 89 ++------- .../app/manager/ApplicationManager.java | 177 ++++++++++++++++++ .../controller/ResourceController.java | 4 + .../jcnc/jnotepad/plugin/PluginLoader.java | 4 +- .../java/org/jcnc/jnotepad/util/UiUtil.java | 4 +- .../bottom/RootBottomSideBarVerticalBox.java | 2 +- 6 files changed, 198 insertions(+), 82 deletions(-) create mode 100644 src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java index 0c37f4a..896d77f 100644 --- a/src/main/java/org/jcnc/jnotepad/LunchApp.java +++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java @@ -1,26 +1,9 @@ package org.jcnc.jnotepad; -import atlantafx.base.theme.PrimerLight; import javafx.application.Application; -import javafx.scene.Scene; -import javafx.scene.layout.Pane; import javafx.stage.Stage; -import javafx.stage.Window; -import org.jcnc.jnotepad.app.i18n.UiResourceBundle; -import org.jcnc.jnotepad.common.constants.AppConstants; -import org.jcnc.jnotepad.common.constants.TextConstants; -import org.jcnc.jnotepad.common.manager.ThreadPoolManager; -import org.jcnc.jnotepad.controller.ResourceController; -import org.jcnc.jnotepad.controller.config.PluginConfigController; -import org.jcnc.jnotepad.controller.i18n.LocalizationController; -import org.jcnc.jnotepad.controller.manager.Controller; -import org.jcnc.jnotepad.plugin.PluginManager; -import org.jcnc.jnotepad.util.UiUtil; -import org.jcnc.jnotepad.views.manager.ViewManager; +import org.jcnc.jnotepad.app.manager.ApplicationManager; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.ExecutorService; /** * 启动程序类 @@ -30,21 +13,7 @@ import java.util.concurrent.ExecutorService; * @author 许轲 */ public class LunchApp extends Application { - - private static final Pane ROOT = new Pane(); - private static final Scene SCENE; - - static { - Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet()); - double width = AppConstants.SCREEN_WIDTH; - double length = AppConstants.SCREEN_LENGTH; - SCENE = new Scene(ROOT, width, length); - } - - /** - * 线程池 - */ - private final ExecutorService threadPool = ThreadPoolManager.getThreadPool(); + private static final ApplicationManager APPLICATION_MANAGER = ApplicationManager.getInstance(); /** * 应用程序的入口点,启动 JavaFX 应用程序。 @@ -55,56 +24,22 @@ public class LunchApp extends Application { launch(args); } - /** - * 获取当前窗口。 - * - * @return 当前窗口 - */ - public static Window getWindow() { - return SCENE.getWindow(); - } - @Override public void start(Stage primaryStage) { - SCENE.getStylesheets().add(Objects.requireNonNull(getClass().getResource("/css/styles.css")).toExternalForm()); - // 初始化UI组件 - initUiComponents(); - UiResourceBundle.bindStringProperty(primaryStage.titleProperty(), TextConstants.TITLE); - - primaryStage.setScene(SCENE); - primaryStage.setWidth(SCENE.getWidth()); - primaryStage.setHeight(SCENE.getHeight()); - primaryStage.getIcons().add(UiUtil.getAppIcon()); - + // 设置参数 + APPLICATION_MANAGER.setApplication(this); + APPLICATION_MANAGER.setPrimaryStage(primaryStage); + // 加载应用程序资源 + APPLICATION_MANAGER.loadAppResources(); + // 初始化应用程序 + APPLICATION_MANAGER.initializeApp(); + // 初始化默认操作 + APPLICATION_MANAGER.initializeDefaultAction(); primaryStage.show(); } - private void initUiComponents() { - - // 1. 加载语言 - LocalizationController.initLocal(); - // 2. 加载资源 - ResourceController.getInstance().loadResources(); - // 3. 初始化插件 - PluginManager.getInstance().initializePlugins(); - // 3. 加载组件 - ViewManager viewManager = ViewManager.getInstance(SCENE); - viewManager.initScreen(SCENE); - - // 使用线程池加载关联文件并创建文本区域 - List rawParameters = getParameters().getRaw(); - Controller.getInstance().openAssociatedFileAndCreateTextArea(rawParameters); - } - @Override public void stop() { - PluginConfigController instance = PluginConfigController.getInstance(); - // 刷新插件配置文件 - instance.getConfig().setPlugins(PluginManager.getInstance().getPluginInfos()); - instance.writeConfig(); - // 销毁插件可能申请的资源 - PluginManager.getInstance().destroyPlugins(); - // 关闭线程池 - threadPool.shutdownNow(); + APPLICATION_MANAGER.stopApp(); } } diff --git a/src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java b/src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java new file mode 100644 index 0000000..b4ac553 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java @@ -0,0 +1,177 @@ +package org.jcnc.jnotepad.app.manager; + +import atlantafx.base.theme.PrimerLight; +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.layout.Pane; +import javafx.stage.Stage; +import javafx.stage.Window; +import org.jcnc.jnotepad.app.i18n.UiResourceBundle; +import org.jcnc.jnotepad.common.constants.AppConstants; +import org.jcnc.jnotepad.common.constants.TextConstants; +import org.jcnc.jnotepad.common.manager.ThreadPoolManager; +import org.jcnc.jnotepad.controller.ResourceController; +import org.jcnc.jnotepad.controller.config.PluginConfigController; +import org.jcnc.jnotepad.controller.manager.Controller; +import org.jcnc.jnotepad.plugin.PluginManager; +import org.jcnc.jnotepad.util.UiUtil; +import org.jcnc.jnotepad.views.manager.ViewManager; + +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ExecutorService; + + +/** + * 应用程序管理类
+ * 此类负责管理应用程序的生命周期等操作 + * + * @author gewuyou + */ +public class ApplicationManager { + private static final ApplicationManager INSTANCE = new ApplicationManager(); + /** + * 线程池 + */ + private final ExecutorService threadPool = ThreadPoolManager.getThreadPool(); + private Pane root = new Pane(); + private Scene scene; + private Stage primaryStage; + private Application application; + + + private ApplicationManager() { + } + + public static ApplicationManager getInstance() { + return INSTANCE; + } + + /** + * 初始化程序 + * + * @apiNote + * @since 2023/9/20 17:26 + */ + public void initializeApp() { + // 设置应用程序主题 + Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet()); + // 初始化scene + initScene(); + // 初始化插件 + PluginManager.getInstance().initializePlugins(); + // 初始化ui组件 + initUiComponents(); + // 初始化primaryStage + initPrimaryStage(); + } + + public void initializeDefaultAction() { + // 使用线程池加载关联文件并创建文本区域 + List rawParameters = application.getParameters().getRaw(); + Controller.getInstance().openAssociatedFileAndCreateTextArea(rawParameters); + } + + private void initScene() { + // 初始化scene + double width = AppConstants.SCREEN_WIDTH; + double length = AppConstants.SCREEN_LENGTH; + scene = new Scene(root, width, length); + scene.getStylesheets().add(Objects.requireNonNull(application.getClass().getResource("/css/styles.css")).toExternalForm()); + } + + private void initPrimaryStage() { + primaryStage.setScene(scene); + primaryStage.setWidth(scene.getWidth()); + primaryStage.setHeight(scene.getHeight()); + primaryStage.getIcons().add(UiUtil.getAppIcon()); + } + + /** + * 加载资源 + * + * @apiNote + * @since 2023/9/20 18:29 + */ + public void loadAppResources() { + // 加载资源 + ResourceController.getInstance().loadResources(); + // 绑定快捷键 + UiResourceBundle.bindStringProperty(primaryStage.titleProperty(), TextConstants.TITLE); + } + + /** + * 停止程序 + * + * @apiNote 在停止程序之前会执行此操作 + */ + public void stopApp() { + PluginConfigController instance = PluginConfigController.getInstance(); + // 刷新插件配置文件 + instance.getConfig().setPlugins(PluginManager.getInstance().getPluginInfos()); + instance.writeConfig(); + // 销毁插件可能申请的资源 + PluginManager.getInstance().destroyPlugins(); + // 关闭线程池 + threadPool.shutdownNow(); + } + + /** + * 获取当前窗口。 + * + * @return 当前窗口 + */ + public Window getWindow() { + return scene.getWindow(); + } + + /** + * 获取当前窗口的场景 + * + * @return javafx.scene.Scene + * @since 2023/9/20 18:21 + */ + public Scene getScene() { + return scene; + } + + public void setScene(Scene scene) { + this.scene = scene; + } + + /** + * 加载ui组件 + * + * @apiNote + * @since 2023/9/20 17:25 + */ + public void initUiComponents() { + // 加载组件 + ViewManager viewManager = ViewManager.getInstance(scene); + viewManager.initScreen(scene); + } + + public Pane getRoot() { + return root; + } + + public void setRoot(Pane root) { + this.root = root; + } + + public Application getApplication() { + return application; + } + + public void setApplication(Application application) { + this.application = application; + } + + public Stage getPrimaryStage() { + return primaryStage; + } + + public void setPrimaryStage(Stage primaryStage) { + this.primaryStage = primaryStage; + } +} diff --git a/src/main/java/org/jcnc/jnotepad/controller/ResourceController.java b/src/main/java/org/jcnc/jnotepad/controller/ResourceController.java index 1f07708..f48d6f6 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/ResourceController.java +++ b/src/main/java/org/jcnc/jnotepad/controller/ResourceController.java @@ -1,6 +1,7 @@ package org.jcnc.jnotepad.controller; import org.jcnc.jnotepad.controller.config.PluginConfigController; +import org.jcnc.jnotepad.controller.i18n.LocalizationController; import org.jcnc.jnotepad.exception.AppException; import org.jcnc.jnotepad.plugin.PluginLoader; import org.jcnc.jnotepad.util.LogUtil; @@ -29,6 +30,9 @@ public class ResourceController { } public void loadResources() { + // 1. 加载语言 + LocalizationController.initLocal(); + // 2. 加载插件 loadPlugins(); } diff --git a/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java b/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java index 4778787..dbd9099 100644 --- a/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java +++ b/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java @@ -208,7 +208,7 @@ public class PluginLoader { } } else { - LogUtil.getLogger(this.getClass()).info("PluginDescriptor file not found"); + logger.info("PluginDescriptor file not found"); } } @@ -227,7 +227,6 @@ public class PluginLoader { URLClassLoader classLoader = new URLClassLoader(new URL[]{pluginJar.toURI().toURL()}); JarFile jar = new JarFile(pluginJar) ) { - logger.info("{}", pluginDescriptor.getMainClass()); // 加载插件所需的依赖类 Enumeration entries = jar.entries(); while (entries.hasMoreElements()) { @@ -241,6 +240,7 @@ public class PluginLoader { } pluginClass = classLoader.loadClass(pluginDescriptor.getMainClass()); } + logger.info("已加载插件:{}", pluginDescriptor.getName()); return pluginClass; } } diff --git a/src/main/java/org/jcnc/jnotepad/util/UiUtil.java b/src/main/java/org/jcnc/jnotepad/util/UiUtil.java index 0d1f073..250cc33 100644 --- a/src/main/java/org/jcnc/jnotepad/util/UiUtil.java +++ b/src/main/java/org/jcnc/jnotepad/util/UiUtil.java @@ -3,7 +3,7 @@ package org.jcnc.jnotepad.util; import atlantafx.base.theme.Styles; import javafx.scene.image.Image; import javafx.stage.Window; -import org.jcnc.jnotepad.LunchApp; +import org.jcnc.jnotepad.app.manager.ApplicationManager; import org.jcnc.jnotepad.common.constants.AppConstants; import org.kordamp.ikonli.javafx.FontIcon; @@ -118,7 +118,7 @@ public class UiUtil { * @apiNote LunchApp.getWindow() */ public static Window getAppWindow() { - return LunchApp.getWindow(); + return ApplicationManager.getInstance().getWindow(); } diff --git a/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java b/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java index b5d6830..05fffce 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java @@ -28,7 +28,7 @@ public class RootBottomSideBarVerticalBox extends AbstractVerticalBox { return INSTANCE; } - public RootBottomSideBarVerticalBox() { + private RootBottomSideBarVerticalBox() { }