From 7d07e6d0e17e5081402af0558950cf238554676c Mon Sep 17 00:00:00 2001 From: tzdwindows 7 <3076584115@qq.com> Date: Sat, 16 Aug 2025 10:33:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(theme):=20=E5=AE=9E=E7=8E=B0=E6=B7=B1?= =?UTF-8?q?=E8=89=B2=E5=92=8C=E6=B5=85=E8=89=B2=E4=B8=BB=E9=A2=98=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 MainWindow 中添加深色主题支持 - 修改 ModernJarViewer 以适配不同主题 - 在 build.gradle 中添加系统类加载器配置 --- build.gradle | 5 +- language/saved_language.properties | 2 +- logo.ico | Bin 4286 -> 16958 bytes .../decompilation/gui/ModernJarViewer.java | 93 ++++++++++++------ .../innovators/box/window/MainWindow.java | 21 +++- 5 files changed, 86 insertions(+), 35 deletions(-) diff --git a/build.gradle b/build.gradle index 3591b88..3c9ee76 100644 --- a/build.gradle +++ b/build.gradle @@ -172,5 +172,8 @@ task runClient(type: JavaExec) { description = "运行 com.axis.innovators.box.Main" classpath = sourceSets.main.runtimeClasspath mainClass = "com.axis.innovators.box.Main" - jvmArgs = ["-Dfile.encoding=UTF-8"] + jvmArgs = [ + "-Dfile.encoding=UTF-8", + "-Djava.system.class.loader=com.axis.innovators.box.plugins.BoxClassLoader" + ] } diff --git a/language/saved_language.properties b/language/saved_language.properties index ad0db79..b23a7c8 100644 --- a/language/saved_language.properties +++ b/language/saved_language.properties @@ -1,3 +1,3 @@ #Current Loaded Language -#Thu Aug 14 20:44:49 CST 2025 +#Fri Aug 15 19:03:09 CST 2025 loadedLanguage=system\:zh_CN diff --git a/logo.ico b/logo.ico index 3dd5b53d48a24f57c41d2e43167c870348b769b7..256af7954865402533b07c3e24a3686b670f1f08 100644 GIT binary patch literal 16958 zcmeI4&u$Yj5XQZsh#q_5oMWXv0++xI3J1g!lmjAgFBg!~=Y(f~Ly`E?pz{4T9%NY? z>THv&7iOz3lWx}beBXG-<4x5N8vV>>L9f$r{3wL`A%tT=r@}(ue0$7R#$R0lSHKl; z1zZ7Fz!h)>Tme_W6>tSy0aw5k*hGQlt4Zh!8>er3+6{d~-%n&;7htYyo(uPcTsO|~ z8P}Bb#h63WHx6&*%XJ~X>ADZXUBTKndjC%NA(ZyRn6>bKvw`36`!1v!z@NB(6-xOt z=2-c6X)qBVVtQGqLGApP;_)-VuMS@MJTMKu=-R8KEq&$lqGta1dm%g)o(iYJOW~uC z^T;*0qiY@r&ji}i2Yuxl)Xbl_y;cD-5pqR+Hl?fi*do1d@=iZ!5d zY)4;X9XN&o5G$1GDYa_q6 zeGd5&`Mr>(u1n*?dve{jG_bXi8i_iQF^8m{#*^Cpy}(+wYYpZa<6LO>5JL+fKWu(e z&+kKnM&p2X+@bk1zWE}%FAb{Up7F;oG+=MDi+h3j^=IE$S?tq!`QK=uco1`P5jlz6 zM4sNqJg6!Eu@61=`XFebHx{V`{$t@e_Z!X94+uXPTvJBe~AnVsq~FUpxOaR`%Z3 z#*+HL+N`r<#wHz=R|x; zzOy9m|Kj(b#BgKS{1jSHKl;1zZ7Fz!h)>Tme_W6>tSy0asw10@s5d zp;-i+z{6g4(X86dV*6>dN6{Wedl0SuXozvttZ8jnw3h#uuo{0F?NPLc(H=xQSy>ym Muiue3V-9!x20e@VssI20 literal 4286 zcmchZF>4e-7=}mClU!kvM(lDRf|Xz)7!1TF=s&Qq6(OJjD?6|7XGBv-iUT_}mV!+{ zK?MsTe;_DWBtZk3N|faBWoDrx6urt$QZ7Yh88u;>PgNj80VT(n*UOSdbS=FTqX^%PNTUj z&HV`V{rdJa2jRGmJ9?OnmxYWtFnJFW2@VI7xW)b^sJ-Tf|!@svoNz1MA4V?UMXY^m*K zNxOAjzL(7zF^>MnsPkLpE3qcpqPQ-*@tHi>5C?)7-if;O_vC9{cx@i2-V^Bj5|0FZ z*TfGo3H_^41D$E{Eb5^3Q;??%qAvXz`T8L6-xUvq=TCV~ycYDsH}P0}kI!#ZHbvF_ zKdG_BbH1bJ+XH`j92fM=K0Ai5s&h7;i<=^gH#Gu}YcyN(@mARXw(2(y{bqJo^vs#C z&1cmw57|`LCw_e4)Be#yGn-ph5)-l6hM0*xv#GAn8nTwGDQj#0tT}66jDfvjk8H!< zv4^SZ_DSxLL--@7$Srcr{>eRZ(Dsz%D7lIaxl0aL)#vVTZgHj-1ZRx1<`_7GoJGgL z8QqKh++DMSzSIaZe@FGXThQUI;m#q3p5QLB{=Djw&_9sh4Y4XZVpn(#cy5a|!5z(A zOvH!Qv$$o#1iZ_p`Tz}NKy4rL7 zWv$PCgnG4oPL0btjpmdzmm<`UTfaO%Qs-0E-t%=?(NDj-*zfO5577&u-3?)}PVjkD G2kk$2YddlP diff --git a/src/main/java/com/axis/innovators/box/decompilation/gui/ModernJarViewer.java b/src/main/java/com/axis/innovators/box/decompilation/gui/ModernJarViewer.java index fc8f620..57881c6 100644 --- a/src/main/java/com/axis/innovators/box/decompilation/gui/ModernJarViewer.java +++ b/src/main/java/com/axis/innovators/box/decompilation/gui/ModernJarViewer.java @@ -1,5 +1,6 @@ package com.axis.innovators.box.decompilation.gui; +import com.axis.innovators.box.AxisInnovatorsBox; import com.axis.innovators.box.window.LoadIcon; import com.axis.innovators.box.util.AdvancedJFileChooser; import com.github.javaparser.JavaParser; @@ -294,6 +295,12 @@ public class ModernJarViewer extends JFrame { setupKeyBindings(); } + private static boolean isDarkTheme() { + if (AxisInnovatorsBox.getMain() == null){ + return false; + } + return AxisInnovatorsBox.getMain().getRegistrationTopic().isDarkMode(); + } private File getAnnotationsFileForJar() { if (currentJarFile == null) { // fallback 存到 config 文件同目录或者用户家目录 @@ -864,9 +871,7 @@ public class ModernJarViewer extends JFrame { "
    " + "
  • CFR 0.152: 当前支持的反混淆器
  • " + "
  • Fernflower: IntelliJ IDEA使用的反混淆器(预留)
  • " + - "
  • Procyon: 另一个开源反混淆器(预留)
  • " + - "
" + - "

注意: 当前仅支持CFR反混淆器,其他选项为预留功能。

" + + "
  • Procyon: 另一个开源反混淆器
  • " + ""; JOptionPane.showMessageDialog(this, helpText, "设置帮助", JOptionPane.INFORMATION_MESSAGE); @@ -874,19 +879,27 @@ public class ModernJarViewer extends JFrame { private void registerFileIcons() { fileTree.setCellRenderer(new DefaultTreeCellRenderer() { - private final ImageIcon jarIcon = new ImageIcon(LoadIcon.loadIcon("programming/JarApiViewer/file_jar.png", 18).getImage()); - private final ImageIcon classIcon = new ImageIcon(LoadIcon.loadIcon("programming/JarApiViewer/java_file.png", 18).getImage()); - private final ImageIcon zipIcon = new ImageIcon(LoadIcon.loadIcon("programming/JarApiViewer/zip_file.png", 12).getImage()); - private final ImageIcon mcmetaIcon = new ImageIcon(LoadIcon.loadIcon("programming/JarApiViewer/mcmeta_file.png", 12).getImage()); - private final ImageIcon cfgIcon = new ImageIcon(LoadIcon.loadIcon("programming/JarApiViewer/cfg_file.png", 12).getImage()); - private final ImageIcon tomlIcon = new ImageIcon(LoadIcon.loadIcon("programming/JarApiViewer/toml_file.png", 12).getImage()); - private final ImageIcon exeIcon = new ImageIcon(LoadIcon.loadIcon("programming/JarApiViewer/exe_file.png", 12).getImage()); + private final Icon jarIcon = loadThemeAwareIcon("programming/JarApiViewer/file_jar.png", 18); + private final Icon classIcon = loadThemeAwareIcon("programming/JarApiViewer/java_file.png", 18); + private final Icon zipIcon = loadThemeAwareIcon("programming/JarApiViewer/zip_file.png", 12); + private final Icon mcmetaIcon = loadThemeAwareIcon("programming/JarApiViewer/mcmeta_file.png", 12); + private final Icon cfgIcon = loadThemeAwareIcon("programming/JarApiViewer/cfg_file.png", 12); + private final Icon tomlIcon = loadThemeAwareIcon("programming/JarApiViewer/toml_file.png", 12); + private final Icon exeIcon = loadThemeAwareIcon("programming/JarApiViewer/exe_file.png", 12); + private final Icon fileIcon = loadThemeAwareIcon("programming/JarApiViewer/file.png", 12); - private final Icon folderIcon = UIManager.getIcon("Tree.closedIcon"); // Changed to Icon - private final ImageIcon fileIcon = new ImageIcon(LoadIcon.loadIcon("programming/JarApiViewer/file.png", 12).getImage()); // Changed to Icon + private final Icon folderIcon = UIManager.getIcon("Tree.closedIcon"); + + private Icon loadThemeAwareIcon(String path, int size) { + String actualPath = !isDarkTheme() ? + path.replace(".png", "_dark.png") : + path; + return new ImageIcon(LoadIcon.loadIcon(actualPath, size).getImage()); + } @Override - public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, + boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; String name = node.getUserObject().toString(); @@ -2480,28 +2493,50 @@ public class ModernJarViewer extends JFrame { } private void configureIDEATheme(SyntaxScheme scheme, RSyntaxTextArea editor) { - Color background = new Color(0x1E1F22); - Color foreground = new Color(0xE0E0E0); + // 根据当前主题是深色还是浅色设置不同的背景和前景色 + Color background = isDarkTheme() ? new Color(0x1E1F22) : new Color(0xFFFFFF); + Color foreground = isDarkTheme() ? new Color(0xE0E0E0) : new Color(0x000000); + Style defaultStyle = scheme.getStyle(Token.NULL); defaultStyle.foreground = foreground; defaultStyle.background = background; - setTokenStyle(scheme, Token.RESERVED_WORD, 0xCC7832); - setTokenStyle(scheme, Token.SEPARATOR, 0x4EC9B0); - setTokenStyle(scheme, Token.OPERATOR, 0xFFD700); - setTokenStyle(scheme, Token.IDENTIFIER, 0xE0E0E0); - setTokenStyle(scheme, Token.LITERAL_STRING_DOUBLE_QUOTE, 0x6A8759); - setTokenStyle(scheme, Token.LITERAL_NUMBER_DECIMAL_INT, 0x6897BB); - setTokenStyle(scheme, Token.COMMENT_EOL, 0x6A8759); - setTokenStyle(scheme, Token.COMMENT_MULTILINE, 0x6A8759); - setTokenStyle(scheme, Token.COMMENT_DOCUMENTATION, 0x629755); - setTokenStyle(scheme, Token.ANNOTATION, 0xBBB529); - setTokenStyle(scheme, Token.FUNCTION, 0xFFC66D); - setTokenStyle(scheme, Token.DATA_TYPE, 0xE8BF6A); + // 深色主题和浅色主题的不同颜色配置 + if (isDarkTheme()) { + setTokenStyle(scheme, Token.RESERVED_WORD, 0xCC7832); + setTokenStyle(scheme, Token.SEPARATOR, 0x4EC9B0); + setTokenStyle(scheme, Token.OPERATOR, 0xFFD700); + setTokenStyle(scheme, Token.IDENTIFIER, 0xE0E0E0); + setTokenStyle(scheme, Token.LITERAL_STRING_DOUBLE_QUOTE, 0x6A8759); + setTokenStyle(scheme, Token.LITERAL_NUMBER_DECIMAL_INT, 0x6897BB); + setTokenStyle(scheme, Token.COMMENT_EOL, 0x6A8759); + setTokenStyle(scheme, Token.COMMENT_MULTILINE, 0x6A8759); + setTokenStyle(scheme, Token.COMMENT_DOCUMENTATION, 0x629755); + setTokenStyle(scheme, Token.ANNOTATION, 0xBBB529); + setTokenStyle(scheme, Token.FUNCTION, 0xFFC66D); + setTokenStyle(scheme, Token.DATA_TYPE, 0xE8BF6A); + + editor.setSelectionColor(new Color(0x214283)); + editor.setCurrentLineHighlightColor(new Color(0x323232)); + } else { + setTokenStyle(scheme, Token.RESERVED_WORD, 0x0000FF); + setTokenStyle(scheme, Token.SEPARATOR, 0x008000); + setTokenStyle(scheme, Token.OPERATOR, 0x000000); + setTokenStyle(scheme, Token.IDENTIFIER, 0x000000); + setTokenStyle(scheme, Token.LITERAL_STRING_DOUBLE_QUOTE, 0x008000); + setTokenStyle(scheme, Token.LITERAL_NUMBER_DECIMAL_INT, 0x0000FF); + setTokenStyle(scheme, Token.COMMENT_EOL, 0x008000); + setTokenStyle(scheme, Token.COMMENT_MULTILINE, 0x008000); + setTokenStyle(scheme, Token.COMMENT_DOCUMENTATION, 0x008000); + setTokenStyle(scheme, Token.ANNOTATION, 0x808000); + setTokenStyle(scheme, Token.FUNCTION, 0x000080); + setTokenStyle(scheme, Token.DATA_TYPE, 0x000080); + + editor.setSelectionColor(new Color(0xADD6FF)); + editor.setCurrentLineHighlightColor(new Color(0xE8E8E8)); + } editor.setBackground(background); - editor.setSelectionColor(new Color(0x214283)); - editor.setCurrentLineHighlightColor(new Color(0x323232)); editor.setHighlightCurrentLine(true); } 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 d13ccc0..afabb27 100644 --- a/src/main/java/com/axis/innovators/box/window/MainWindow.java +++ b/src/main/java/com/axis/innovators/box/window/MainWindow.java @@ -127,6 +127,9 @@ public class MainWindow extends JFrame { }); setLocationRelativeTo(null); + + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + setSize(1200, 800); } /** @@ -154,8 +157,6 @@ public class MainWindow extends JFrame { getContentPane().removeAll(); setTitle(LanguageManager.getLoadedLanguages().getText("mainWindow.title")); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - setSize(1200, 800); // 主容器 JPanel mainPanel = new JPanel(new BorderLayout()); @@ -877,7 +878,7 @@ public class MainWindow extends JFrame { return card; } - private boolean isDarkTheme() { + private static boolean isDarkTheme() { return AxisInnovatorsBox.getMain().getRegistrationTopic().isDarkMode(); } @@ -1183,7 +1184,19 @@ public class MainWindow extends JFrame { } public void addTool(ToolItem tool) { tools.add(tool); } public String getDescription() { return description; } - public String getIcon() { return icon; } + public String getIcon() { + if (isDarkTheme()) { + int lastDotIndex = 0; + if (icon != null) { + lastDotIndex = icon.lastIndexOf('.'); + } + if (lastDotIndex > 0) { + return icon.substring(0, lastDotIndex) + "_dark" + icon.substring(lastDotIndex); + } + return icon + "_dark"; + } + return icon; + } public String getName() { return name; } public List getTools() { return tools; } public ImageIcon getIconImage() { return iconImage; }