From 167bf6405f4a5703c75f35ab9c15c2b69926c9da Mon Sep 17 00:00:00 2001 From: tzdwindows 7 <3076584115@qq.com> Date: Mon, 6 Oct 2025 11:00:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(theme):=20=E5=AE=9E=E7=8E=B0Windows?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=E5=8F=98=E6=9B=B4=E7=9B=91=E5=90=AC=E4=B8=8E?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加WindowsTheme工具类用于监听系统主题变更 - 实现runMonitorTopics方法监控主题变化并自动更新- 新增TopicsUpdateEvents事件类用于主题更新通知 - 重构setTopic方法使用updateTheme统一处理主题设置 -优化MainWindow背景透明度更新逻辑- 添加isSettingsVisible方法判断设置界面可见状态 - 移除RegisterTray类中的静态库加载代码 - 调整设置面板显示逻辑,支持重新显示已打开的设置窗口 -修复库加载错误日志信息 - 添加异常堆栈打印到崩溃报告组织方法中 --- library/RegisterTray.dll | Bin 32768 -> 38400 bytes .../innovators/box/AxisInnovatorsBox.java | 61 ++++++++++++++--- .../box/events/TopicsUpdateEvents.java | 28 ++++++++ .../register/RegistrationSettingsItem.java | 17 +++-- .../innovators/box/tools/RegisterTray.java | 5 -- .../innovators/box/util/WindowsTheme.java | 64 ++++++++++++++++++ .../innovators/box/window/MainWindow.java | 45 ++++++++---- 7 files changed, 186 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/axis/innovators/box/events/TopicsUpdateEvents.java create mode 100644 src/main/java/com/axis/innovators/box/util/WindowsTheme.java diff --git a/library/RegisterTray.dll b/library/RegisterTray.dll index dac2ffa0a1afb2899a986f2eba392ee377f6f9e6..62aa649eb7ae35de72bebfb644e704e104ed0445 100644 GIT binary patch delta 18140 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 { String systemOut = Log4j2OutputStream.systemOutContent.toString(); String systemErr = Log4j2OutputStream.systemErrContent.toString(); @@ -713,6 +720,28 @@ public class AxisInnovatorsBox { return tempFile; } + /** + * 运行监控主题 + */ + public void runMonitorTopics(){ + WindowsTheme.setThemeChangeListener((themeName, darkTheme) -> { + logger.info("主题变更: {}, 暗主题: {}", themeName, darkTheme); + if (registrationTopic.isDarkMode() == darkTheme){ + return; + } + try { + updateTheme(themeName,darkTheme); + } catch (UnsupportedLookAndFeelException e) { + throw new RuntimeException(e); + } + + if (SwingUtilities.isEventDispatchThread()) { + reloadAllWindow(); + } else { + SwingUtilities.invokeLater(this::reloadAllWindow); + } + }); + } private void addFileToZip(ZipOutputStream zos, File file, String entryPath) throws IOException { if (!file.exists()) { return; @@ -804,7 +833,7 @@ public class AxisInnovatorsBox { private void setTopic() { try { - boolean isDarkMode = SystemInfoUtil.isSystemDarkMode(); + boolean isDarkMode = WindowsTheme.isDarkTheme(); // 1. 默认系统主题 main.registrationTopic.addTopic( @@ -932,16 +961,26 @@ public class AxisInnovatorsBox { // "system:blur",true //); - LookAndFeel defaultLaf = isDarkMode ? new FlatMacDarkLaf() : new FlatMacLightLaf(); - UIManager.setLookAndFeel(defaultLaf); - main.registrationTopic.setLoading( - isDarkMode ? "system:flatMacDark_theme" : "system:flatMacLight_theme" - ); + updateTheme("",isDarkMode); } catch (Exception e) { logger.warn("Failed to load the system facade class", e); } } + /** + * 更新主题 + * @param themeName 主题名称 + * @param isDarkMode 是否是暗主题 + */ + public void updateTheme(String themeName,boolean isDarkMode) throws UnsupportedLookAndFeelException { + LookAndFeel defaultLaf = isDarkMode ? new FlatMacDarkLaf() : new FlatMacLightLaf(); + UIManager.setLookAndFeel(defaultLaf); + main.registrationTopic.setLoading( + isDarkMode ? "system:flatMacDark_theme" : "system:flatMacLight_theme" + ); + GlobalEventBus.EVENT_BUS.post(new TopicsUpdateEvents(themeName,isDarkMode)); + } + /** * 弹出窗口 * @param windowsJDialog 窗口 @@ -1051,7 +1090,7 @@ public class AxisInnovatorsBox { try { main.initLog4j2(); main.setTopic(); - + main.runMonitorTopics(); //main.popupLogin(); main.thread = new Thread(() -> { try { @@ -1155,6 +1194,12 @@ public class AxisInnovatorsBox { isWindow = true; ex.setVisible(true); + Toolkit.getDefaultToolkit().addPropertyChangeListener("win.xpstyle.themeName", + evt -> { + logger.info("系统主题发生变化: {}", evt.getNewValue()); + ex.updateTheme(); + }); + if (isDebug) { SwingUtilities.invokeLater(this::createDebugWindow); } diff --git a/src/main/java/com/axis/innovators/box/events/TopicsUpdateEvents.java b/src/main/java/com/axis/innovators/box/events/TopicsUpdateEvents.java new file mode 100644 index 0000000..0f14175 --- /dev/null +++ b/src/main/java/com/axis/innovators/box/events/TopicsUpdateEvents.java @@ -0,0 +1,28 @@ +package com.axis.innovators.box.events; + +/** + * 当主题变更时被调用 + * @author tzdwindows 7 + */ +public class TopicsUpdateEvents { + private final String themeName; + private final boolean darkTheme; + + /** + * 构造函数 + * @param themeName 主题名称 + * @param darkTheme 是否是暗主题 + */ + public TopicsUpdateEvents(String themeName, boolean darkTheme) { + this.themeName = themeName; + this.darkTheme = darkTheme; + } + + public String getThemeName() { + return themeName; + } + + public boolean isDarkTheme() { + return darkTheme; + } +} diff --git a/src/main/java/com/axis/innovators/box/register/RegistrationSettingsItem.java b/src/main/java/com/axis/innovators/box/register/RegistrationSettingsItem.java index 5543935..2f60d8d 100644 --- a/src/main/java/com/axis/innovators/box/register/RegistrationSettingsItem.java +++ b/src/main/java/com/axis/innovators/box/register/RegistrationSettingsItem.java @@ -80,28 +80,31 @@ public class RegistrationSettingsItem extends WindowsJDialog { JPanel aboutPanel = createAboutPanel(); JPanel themePanel = createThemePanel(); - registrationSettingsItem.addSettings( - pluginPanel, language.getText("settings.1.title"), - null, language.getText("settings.1.tip"), "system:settings_plugins_item" - ); registrationSettingsItem.addSettings( generalPanel, language.getText("settings.2.title"), null, language.getText("settings.2.tip"), "system:settings_appearance_item" ); registrationSettingsItem.addSettings( - aboutPanel, language.getText("settings.3.title"), - null, language.getText("settings.3.tip"), "system:settings_information_item" + pluginPanel, language.getText("settings.1.title"), + null, language.getText("settings.1.tip"), "system:settings_plugins_item" ); registrationSettingsItem.addSettings( themePanel, language.getText("settings.4.title"), null, language.getText("settings.4.tip"), "system:settings_theme_item" ); + registrationSettingsItem.addSettings( + aboutPanel, language.getText("settings.3.title"), + null, language.getText("settings.3.tip"), "system:settings_information_item" + ); registrationSettingsItemList.add( registrationSettingsItem ); - AxisInnovatorsBox.getMain().getMainWindow().showSettings(); + // 重新显示 + if (AxisInnovatorsBox.getMain().getMainWindow().isSettingsVisible()) { + AxisInnovatorsBox.getMain().getMainWindow().showSettings(); + } } private static JPanel createThemePanel() { diff --git a/src/main/java/com/axis/innovators/box/tools/RegisterTray.java b/src/main/java/com/axis/innovators/box/tools/RegisterTray.java index e9839ad..01f2033 100644 --- a/src/main/java/com/axis/innovators/box/tools/RegisterTray.java +++ b/src/main/java/com/axis/innovators/box/tools/RegisterTray.java @@ -12,11 +12,6 @@ import java.util.List; */ public class RegisterTray { - static { - LibraryLoad.loadLibrary("RegisterTray"); - //System.load("C:\\Users\\Administrator\\source\\repos\\RegisterTray\\x64\\Release\\RegisterTray.dll"); - } - /** * 托盘菜单项构建器(流畅接口) */ diff --git a/src/main/java/com/axis/innovators/box/util/WindowsTheme.java b/src/main/java/com/axis/innovators/box/util/WindowsTheme.java new file mode 100644 index 0000000..ab157e2 --- /dev/null +++ b/src/main/java/com/axis/innovators/box/util/WindowsTheme.java @@ -0,0 +1,64 @@ +package com.axis.innovators.box.util; + +/** + * Windows主题变更监听器 + * @author tzdwindows 7 + */ +public class WindowsTheme { + + /** + * 设置主题改变监听器 + * @param listener 监听器 + */ + public static native void setThemeChangeListener(ThemeChangeListener listener); + + /** + * 主题改变监听器 + */ + public interface ThemeChangeListener { + /** + * 当主题改变时调用 + * @param themeName 主题名称 + * @param darkTheme 是否是暗主题 + */ + void themeChanged(String themeName,boolean darkTheme); + } + + /** + * 获取当前是否为暗色主题 + * @return true-暗色主题, false-亮色主题 + */ + public static native boolean isDarkTheme(); + + /** + * 获取当前主题名称 + * @return 主题名称 + */ + public static native String getThemeName(); + + //public static void main(String[] args) { + // try { + // System.load("C:\\Users\\Administrator\\source\\repos\\RegisterTray\\x64\\Release\\RegisterTray.dll"); +// + // // 先测试直接获取主题信息的方法 + // System.out.println("Current topic Name: " + WindowsTheme.getThemeName()); + // System.out.println("Is it a dark theme: " + WindowsTheme.isDarkTheme()); +// + // WindowsTheme.setThemeChangeListener(new WindowsTheme.ThemeChangeListener() { + // @Override + // public void themeChanged(String themeName, boolean darkTheme) { + // System.out.println("The theme has changed: " + themeName + " is dark theme: " + darkTheme); + // } + // }); +// + // System.out.println("Start listening for theme changes... Press Enter to exit"); +// + // System.in.read(); +// + // } catch (Exception e) { + // e.printStackTrace(); + // } finally { + // WindowsTheme.setThemeChangeListener(null); + // } + //} +} diff --git a/src/main/java/com/axis/innovators/box/window/MainWindow.java b/src/main/java/com/axis/innovators/box/window/MainWindow.java index 3fda320..05dd1c6 100644 --- a/src/main/java/com/axis/innovators/box/window/MainWindow.java +++ b/src/main/java/com/axis/innovators/box/window/MainWindow.java @@ -155,19 +155,7 @@ public class MainWindow extends JFrame { this.backgroundOpacity = Math.max(0.0f, Math.min(1.0f, opacity)); this.cachedBlurredBackground = null; this.cachedBackgroundSize = null; - - // 重新绘制窗口 - if (AxisInnovatorsBox.getMain().isWindow()) { - AxisInnovatorsBox.getMain().reloadAllWindow(); - } - else { - getContentPane().removeAll(); - revalidate(); - repaint(); - initUI(); - updateTheme(); - revalidate(); - } + AxisInnovatorsBox.getMain().reloadAllWindow(); } /** @@ -965,6 +953,36 @@ public class MainWindow extends JFrame { return wrapper; } + + /** + * 判断设置界面是否打开 + * @return 设置界面是否可见 + */ + public boolean isSettingsVisible(){ + if (dialog == null) { + return false; + } + + if (!dialog.isDisplayable()) { + dialog = null; + return false; + } + + if (!dialog.isVisible()) { + return false; + } + try { + if (dialog.getParent() != this && dialog.getOwner() != this) { + dialog = null; + return false; + } + } catch (Exception e) { + dialog = null; + return false; + } + return true; + } + private JPanel createToolCard(ToolItem tool) { JPanel card = new JPanel() { @Override @@ -1368,7 +1386,6 @@ public class MainWindow extends JFrame { dialog.setSize(750, 550); dialog.setLocationRelativeTo(this); - // 使用 JLayer + LayerUI 来对整个内容做统一的淡入 + 下滑(仿 Apple 风格)动画, // 这样子组件也会跟随一起动画,而不是只有背景绘制发生变化。 JPanel inner = new JPanel(new BorderLayout());