diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index de63a22..85e08dc 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/build.gradle b/build.gradle
index 8a2c63d..3591b88 100644
--- a/build.gradle
+++ b/build.gradle
@@ -56,6 +56,7 @@ dependencies {
implementation 'com.formdev:flatlaf:3.2.1'
implementation 'com.formdev:flatlaf-extras:3.2.1'
implementation 'com.formdev:flatlaf-intellij-themes:3.2.1'
+ implementation 'io.github.vincenzopalazzo:material-ui-swing:1.1.2'
implementation 'org.python:jython-standalone:2.7.3'
implementation 'org.graalvm.python:python-embedding:24.2.1'
implementation files('libs/JNC-1.0-jnc.jar')
diff --git a/language/saved_language.properties b/language/saved_language.properties
index 4374e0f..ad0db79 100644
--- a/language/saved_language.properties
+++ b/language/saved_language.properties
@@ -1,3 +1,3 @@
#Current Loaded Language
-#Thu Aug 14 15:17:57 CST 2025
+#Thu Aug 14 20:44:49 CST 2025
loadedLanguage=system\:zh_CN
diff --git a/language/sys_zh_CN.properties b/language/sys_zh_CN.properties
index 975d0d1..1aabffd 100644
--- a/language/sys_zh_CN.properties
+++ b/language/sys_zh_CN.properties
@@ -29,6 +29,15 @@ flatMacLight_theme.default.tip=\u7C7B\u4F3C macOS \u7684\u6D45\u8272\u98CE\u683C
flatMacDark_theme.system.topicName=macOS \u6DF1\u8272
flatMacDark_theme.default.tip=\u7C7B\u4F3C macOS \u7684\u6DF1\u8272\u6A21\u5F0F\uFF0C\u4F18\u96C5\u73B0\u4EE3
+mars_dark_theme.system.topicName=MaterialLookAndFeel\u7684\u6697\u8272
+mars_dark_theme.default.tip=\u57FA\u4E8E MaterialLookAndFeel \u7684\u6697\u8272\u4E3B\u9898
+
+material_lite_theme.system.topicName=MaterialLookAndFeel\u7684\u6D45\u8272
+material_lite_theme.default.tip=\u57FA\u4E8E MaterialLookAndFeel \u7684\u6D45\u8272\u4E3B\u9898\uFF0CMaterial Design \u98CE\u683C
+
+material_oceanic_theme.system.topicName=MaterialLookAndFeel\u7684\u6DF1\u8272
+material_oceanic_theme.default.tip=\u57FA\u4E8E MaterialLookAndFeel \u7684\u6D45\u8272\u4E3B\u9898\uFF0CMaterial Design \u98CE\u683C
+
flatLightLaf_theme.system.topicName=flatLightLaf\u98CE\u683C
flatLightLaf_theme.default.tip=flatLightLaf\u98CE\u683C
diff --git a/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java b/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java
index c75b6ed..7441383 100644
--- a/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java
+++ b/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java
@@ -19,6 +19,10 @@ import com.axis.innovators.box.verification.UserTags;
import com.formdev.flatlaf.themes.FlatMacDarkLaf;
import com.formdev.flatlaf.themes.FlatMacLightLaf;
import com.sun.management.HotSpotDiagnosticMXBean;
+import mdlaf.MaterialLookAndFeel;
+import mdlaf.themes.JMarsDarkTheme;
+import mdlaf.themes.MaterialLiteTheme;
+import mdlaf.themes.MaterialOceanicTheme;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Appender;
@@ -725,7 +729,7 @@ public class AxisInnovatorsBox {
LanguageManager.getLoadedLanguages().getText("default_theme.default.tip"),
LoadIcon.loadIcon(MainWindow.class, "logo.png", 64),
"system:default_theme",
- isDarkMode // 检测系统当前是否为暗黑模式
+ isDarkMode
);
// 2. Metal (Java默认主题) - 浅色主题
@@ -809,6 +813,33 @@ public class AxisInnovatorsBox {
true
);
+ main.registrationTopic.addTopic(
+ new MaterialLookAndFeel(new JMarsDarkTheme()),
+ LanguageManager.getLoadedLanguages().getText("mars_dark_theme.system.topicName"),
+ LanguageManager.getLoadedLanguages().getText("mars_dark_theme.default.tip"),
+ LoadIcon.loadIcon(MainWindow.class, "logo.png", 64),
+ "system:mars_dark_theme",
+ true
+ );
+
+ main.registrationTopic.addTopic(
+ new MaterialLookAndFeel(new MaterialLiteTheme()),
+ LanguageManager.getLoadedLanguages().getText("material_lite_theme.system.topicName"),
+ LanguageManager.getLoadedLanguages().getText("material_lite_theme.default.tip"),
+ LoadIcon.loadIcon(MainWindow.class, "logo.png", 64),
+ "system:material_lite_theme",
+ false
+ );
+
+ main.registrationTopic.addTopic(
+ new MaterialLookAndFeel(new MaterialOceanicTheme()),
+ LanguageManager.getLoadedLanguages().getText("material_oceanic_theme.system.topicName"),
+ LanguageManager.getLoadedLanguages().getText("material_oceanic_theme.default.tip"),
+ LoadIcon.loadIcon(MainWindow.class, "logo.png", 64),
+ "system:material_oceanic_theme",
+ true
+ );
+
LookAndFeel defaultLaf = isDarkMode ? new FlatMacDarkLaf() : new FlatMacLightLaf();
UIManager.setLookAndFeel(defaultLaf);
main.registrationTopic.setLoading(
diff --git a/src/main/java/com/axis/innovators/box/window/FridaWindow.java b/src/main/java/com/axis/innovators/box/window/FridaWindow.java
index d6fa538..b74aac5 100644
--- a/src/main/java/com/axis/innovators/box/window/FridaWindow.java
+++ b/src/main/java/com/axis/innovators/box/window/FridaWindow.java
@@ -47,14 +47,6 @@ public class FridaWindow extends WindowsJDialog {
initUI();
}
- static {
- Font chineseFont = new Font("Microsoft YaHei", Font.PLAIN, 13);
- UIManager.put("Menu.font", chineseFont);
- UIManager.put("MenuItem.font", chineseFont);
- UIManager.put("Button.font", chineseFont);
- UIManager.put("ComboBox.font", chineseFont);
- }
-
@Override
public void initUI() {
super.initUI();
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 42a27ef..9f33c61 100644
--- a/src/main/java/com/axis/innovators/box/window/MainWindow.java
+++ b/src/main/java/com/axis/innovators/box/window/MainWindow.java
@@ -18,6 +18,7 @@ import javax.swing.plaf.basic.BasicScrollBarUI;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
import java.awt.*;
import java.awt.event.*;
+import java.awt.geom.Point2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.util.*;
@@ -245,7 +246,7 @@ public class MainWindow extends JFrame {
JLabel title = new JLabel(LanguageManager.getLoadedLanguages().getText("mainWindow.title.2"));
title.setFont(new Font(selectFont("Segoe UI", "Microsoft YaHei", "SansSerif", 18).getName(), Font.BOLD, 18));
- title.setForeground(UIManager.getColor("Label.foreground"));
+ //title.setForeground(UIManager.getColor("Label.foreground"));
JPanel left = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 0));
left.setOpaque(false);
@@ -278,7 +279,6 @@ public class MainWindow extends JFrame {
return header;
}
- // 自定义圆角的搜索文本框容器(含聚焦动画)
private static class RoundedSearchField extends JPanel {
private final JTextField textField;
private int targetWidth;
@@ -287,41 +287,59 @@ public class MainWindow extends JFrame {
private final int baseWidth;
private final int heightPx;
+ // 动画相关变量
+ private float glowPosition = 0f;
+ private final Timer glowTimer;
+ private Color defaultBorderColor;
+ private boolean focused = false;
+
RoundedSearchField(int baseWidth, int heightPx) {
this.baseWidth = baseWidth;
this.heightPx = heightPx;
this.targetWidth = baseWidth;
setOpaque(false);
setLayout(new BorderLayout());
+
+ // 获取系统默认边框色
+ defaultBorderColor = UIManager.getColor("TextField.borderColor");
+ if (defaultBorderColor == null) {
+ defaultBorderColor = new Color(180, 180, 180); // 备用默认色
+ }
+
textField = new JTextField();
textField.setBorder(BorderFactory.createEmptyBorder(6, 10, 6, 10));
textField.setOpaque(false);
textField.setFont(UIManager.getFont("TextField.font"));
- // initial size
setPreferredSize(new Dimension(baseWidth, heightPx));
add(textField, BorderLayout.CENTER);
- // focus listener -> expand + highlight
+ // 焦点监听器
textField.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
+ focused = true;
animateTo(baseWidth + 80);
+ glowTimer.start();
}
@Override
public void focusLost(FocusEvent e) {
+ focused = false;
animateTo(baseWidth);
+ glowTimer.stop();
+ repaint();
}
});
- // mouse click on panel focuses textfield
+ // 点击面板聚焦文本框
addMouseListener(new MouseAdapter() {
- @Override public void mouseClicked(MouseEvent e) { textField.requestFocusInWindow(); }
+ @Override public void mouseClicked(MouseEvent e) {
+ textField.requestFocusInWindow();
+ }
});
- // animation timer
+ // 尺寸动画定时器
animTimer = new Timer(16, ae -> {
- // smooth progress towards target width
int curW = getWidth();
int diff = targetWidth - curW;
if (Math.abs(diff) <= 1) {
@@ -337,6 +355,65 @@ public class MainWindow extends JFrame {
repaint();
}
});
+
+ // 发光动画定时器
+ glowTimer = new Timer(30, e -> {
+ glowPosition = (glowPosition + 0.03f) % 1f;
+ repaint();
+ });
+ }
+
+ @Override
+ protected void paintComponent(Graphics g) {
+ super.paintComponent(g);
+ Graphics2D g2d = (Graphics2D) g.create();
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+ int arc = heightPx / 2; // 圆角半径
+ int borderThickness = focused ? 2 : 1;
+
+ // 绘制背景
+ g2d.setColor(getBackground());
+ g2d.fillRoundRect(0, 0, getWidth(), getHeight(), arc, arc);
+
+ // 绘制边框
+ if (focused) {
+ // 流动彩虹渐变
+ float[] fractions = {0f, 0.25f, 0.5f, 0.75f, 1f};
+ Color[] colors = {
+ new Color(255, 0, 0, 200), // 红
+ new Color(255, 165, 0, 200), // 橙
+ new Color(0, 255, 0, 200), // 绿
+ new Color(0, 191, 255, 200), // 蓝
+ new Color(148, 0, 211, 200) // 紫
+ };
+
+ // 创建循环渐变
+ Point2D start = new Point2D.Float(getWidth() * glowPosition, 0);
+ Point2D end = new Point2D.Float(getWidth() * glowPosition + getWidth(), 0);
+ LinearGradientPaint gradient = new LinearGradientPaint(
+ start, end, fractions, colors
+ );
+
+ g2d.setPaint(gradient);
+ g2d.setStroke(new BasicStroke(2.5f));
+ } else {
+ g2d.setColor(defaultBorderColor);
+ g2d.setStroke(new BasicStroke(1f));
+ }
+
+ g2d.drawRoundRect(borderThickness/2, borderThickness/2,
+ getWidth() - borderThickness, getHeight() - borderThickness,
+ arc, arc);
+
+ // 添加发光效果
+ if (focused) {
+ g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f));
+ g2d.setStroke(new BasicStroke(4f));
+ g2d.drawRoundRect(0, 0, getWidth(), getHeight(), arc, arc);
+ }
+
+ g2d.dispose();
}
void animateTo(int w) {