diff --git a/README.md b/README.md index a3b2b89..6a3c506 100644 --- a/README.md +++ b/README.md @@ -401,6 +401,32 @@ private void configureMessageRouter(BrowserWindowJDialog window) { } ``` +## HTML事件 +HTML窗口内可以捕捉到一些Java的事件 + +| 事件名 | 介绍 | 触发时机 | +|--------|------------|---------------------| +| `javaFontsLoaded` | Java字体加载完成 | Java字体信息传输到HTML时,或在在更新主题时 | +| `javaThemeChanged` | 在主题发生变化时触发 | 在更新主题时 | + +#### 具体示例 + +```javascript +// 监听Java字体加载事件 +document.addEventListener('javaFontsLoaded', function(event) { + const fontInfo = event.detail; + console.log('接收到Java字体信息:', fontInfo); + + // 应用Java字体到界面 + applyJavaFonts(fontInfo); +}); +// 监听Java主题变化事件 +document.addEventListener('javaThemeChanged', function(event) { + const themeInfo = event.detail; + console.log('接收到Java主题信息:', themeInfo); + applyJavaTheme(themeInfo); +}); +``` ### 窗口管理系统说明 通过`WindowRegistry`统一管理应用窗口: diff --git a/javascript/AIaToolbox_dark.html b/javascript/AIaToolbox_dark.html index b4f28ec..50788e6 100644 --- a/javascript/AIaToolbox_dark.html +++ b/javascript/AIaToolbox_dark.html @@ -584,6 +584,59 @@ ignoreUnescapedHTML: true }); + // 监听Java字体加载事件 + document.addEventListener('javaFontsLoaded', function(event) { + const fontInfo = event.detail; + console.log('接收到Java字体信息:', fontInfo); + + // 应用Java字体到界面 + applyJavaFonts(fontInfo); + }); + + // 应用Java字体的函数 + function applyJavaFonts(fontInfo) { + const uiFonts = fontInfo.uiFonts || {}; + const defaultFont = fontInfo.defaultFont || uiFonts['Label.font'] || {}; + + if (defaultFont && defaultFont.family) { + const fontFamily = defaultFont.family; + const fontSize = defaultFont.size || 14; + const fontWeight = defaultFont.bold ? 'bold' : 'normal'; + const fontStyle = defaultFont.italic ? 'italic' : 'normal'; + + // 创建字体样式 + const style = document.createElement('style'); + style.textContent = ` + body, html { + font-family: '${fontFamily}', 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Microsoft YaHei', sans-serif !important; + } + .message.user .bubble { + font-family: '${fontFamily}', 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Microsoft YaHei', sans-serif !important; + } + .message.ai .bubble { + font-family: '${fontFamily}', 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Microsoft YaHei', sans-serif !important; + font-size: ${fontSize}px !important; + } + input, button { + font-family: '${fontFamily}', 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Microsoft YaHei', sans-serif !important; + } + code, pre { + font-family: 'JetBrains Mono', 'Consolas', 'Monaco', 'Courier New', monospace !important; + } + `; + + // 添加到文档头 + document.head.appendChild(style); + + console.log('Java字体已应用到DeepSeek界面:', fontFamily, fontSize + 'px'); + } + } + + // 如果字体信息已经存在,立即应用 + if (typeof window.javaFontInfo !== 'undefined') { + applyJavaFonts(window.javaFontInfo); + } + // CEF通信桥接 window.javaQuery = window.cefQuery ? (request, success, error) => { window.cefQuery({ diff --git a/javascript/AIaToolbox_light.html b/javascript/AIaToolbox_light.html index 9d5ed0e..dad89e9 100644 --- a/javascript/AIaToolbox_light.html +++ b/javascript/AIaToolbox_light.html @@ -624,6 +624,59 @@ ); } + // 监听Java字体加载事件 + document.addEventListener('javaFontsLoaded', function(event) { + const fontInfo = event.detail; + console.log('接收到Java字体信息:', fontInfo); + + // 应用Java字体到界面 + applyJavaFonts(fontInfo); + }); + + // 应用Java字体的函数 + function applyJavaFonts(fontInfo) { + const uiFonts = fontInfo.uiFonts || {}; + const defaultFont = fontInfo.defaultFont || uiFonts['Label.font'] || {}; + + if (defaultFont && defaultFont.family) { + const fontFamily = defaultFont.family; + const fontSize = defaultFont.size || 14; + const fontWeight = defaultFont.bold ? 'bold' : 'normal'; + const fontStyle = defaultFont.italic ? 'italic' : 'normal'; + + // 创建字体样式 + const style = document.createElement('style'); + style.textContent = ` + body, html { + font-family: '${fontFamily}', 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Microsoft YaHei', sans-serif !important; + } + .message.user .bubble { + font-family: '${fontFamily}', 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Microsoft YaHei', sans-serif !important; + } + .message.ai .bubble { + font-family: '${fontFamily}', 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Microsoft YaHei', sans-serif !important; + font-size: ${fontSize}px !important; + } + input, button { + font-family: '${fontFamily}', 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Microsoft YaHei', sans-serif !important; + } + code, pre { + font-family: 'JetBrains Mono', 'Consolas', 'Monaco', 'Courier New', monospace !important; + } + `; + + // 添加到文档头 + document.head.appendChild(style); + + console.log('Java字体已应用到DeepSeek界面:', fontFamily, fontSize + 'px'); + } + } + + // 如果字体信息已经存在,立即应用 + if (typeof window.javaFontInfo !== 'undefined') { + applyJavaFonts(window.javaFontInfo); + } + function showError(requestId, message) { const stream = streams.get(requestId); if (stream) { diff --git a/javascript/CCodeEditor.html b/javascript/CCodeEditor.html index 5f5605c..9783dcb 100644 --- a/javascript/CCodeEditor.html +++ b/javascript/CCodeEditor.html @@ -122,6 +122,61 @@ }); }); + // 监听Java字体加载事件 + document.addEventListener('javaFontsLoaded', function(event) { + const fontInfo = event.detail; + console.log('接收到Java字体信息:', fontInfo); + + // 应用Java字体到编辑器 + applyJavaFonts(fontInfo); + }); + +// 应用Java字体的函数 + function applyJavaFonts(fontInfo) { + const uiFonts = fontInfo.uiFonts || {}; + const defaultFont = fontInfo.defaultFont || uiFonts['Label.font'] || {}; + + if (defaultFont && defaultFont.family) { + const fontFamily = defaultFont.family; + const fontSize = defaultFont.size || 14; + const fontWeight = defaultFont.bold ? 'bold' : 'normal'; + const fontStyle = defaultFont.italic ? 'italic' : 'normal'; + + // 创建字体样式 + const style = document.createElement('style'); + style.textContent = ` + body, html { + font-family: '${fontFamily}', 'JetBrains Mono', 'Consolas', monospace !important; + } + #output { + font-family: '${fontFamily}', 'JetBrains Mono', monospace !important; + font-size: ${fontSize}px !important; + } + #executeBtn { + font-family: '${fontFamily}', 'JetBrains Mono', monospace !important; + } + `; + + // 添加到文档头 + document.head.appendChild(style); + + // 更新Monaco编辑器字体 + if (window.editor) { + editor.updateOptions({ + fontFamily: fontFamily, + fontSize: fontSize + }); + } + + console.log('Java字体已应用到编辑器:', fontFamily, fontSize + 'px'); + } + } + + // 如果字体信息已经存在,立即应用 + if (typeof window.javaFontInfo !== 'undefined') { + applyJavaFonts(window.javaFontInfo); + } + monaco.languages.register({ id: 'c' }); // C语言关键字配置 diff --git a/javascript/CodeEditor.html b/javascript/CodeEditor.html index c32212d..aecc57e 100644 --- a/javascript/CodeEditor.html +++ b/javascript/CodeEditor.html @@ -129,7 +129,60 @@ editor.setValue(getDefaultCode(lang)); } + // 监听Java字体加载事件 + document.addEventListener('javaFontsLoaded', function(event) { + const fontInfo = event.detail; + console.log('接收到Java字体信息:', fontInfo); + // 应用Java字体到编辑器 + applyJavaFonts(fontInfo); + }); + + // 应用Java字体的函数 + function applyJavaFonts(fontInfo) { + const uiFonts = fontInfo.uiFonts || {}; + const defaultFont = fontInfo.defaultFont || uiFonts['Label.font'] || {}; + + if (defaultFont && defaultFont.family) { + const fontFamily = defaultFont.family; + const fontSize = defaultFont.size || 14; + const fontWeight = defaultFont.bold ? 'bold' : 'normal'; + const fontStyle = defaultFont.italic ? 'italic' : 'normal'; + + // 创建字体样式 + const style = document.createElement('style'); + style.textContent = ` + body, html { + font-family: '${fontFamily}', 'Microsoft YaHei', sans-serif !important; + } + #output { + font-family: '${fontFamily}', 'Microsoft YaHei', monospace !important; + font-size: ${fontSize}px !important; + } + .btn, #language-select, #status { + font-family: '${fontFamily}', 'Microsoft YaHei', sans-serif !important; + } + `; + + // 添加到文档头 + document.head.appendChild(style); + + // 更新Monaco编辑器字体 + if (window.editor) { + editor.updateOptions({ + fontFamily: fontFamily, + fontSize: fontSize + }); + } + + console.log('Java字体已应用到编辑器:', fontFamily, fontSize + 'px'); + } + } + + // 如果字体信息已经存在,立即应用 + if (typeof window.javaFontInfo !== 'undefined') { + applyJavaFonts(window.javaFontInfo); + } function runCode() { const code = editor.getValue(); diff --git a/javascript/HtmlViewer.html b/javascript/HtmlViewer.html index 6ffb8a0..92fda7b 100644 --- a/javascript/HtmlViewer.html +++ b/javascript/HtmlViewer.html @@ -446,6 +446,62 @@ } })(); + // 监听Java字体加载事件 + document.addEventListener('javaFontsLoaded', function(event) { + const fontInfo = event.detail; + console.log('接收到Java字体信息:', fontInfo); + + // 应用Java字体到编辑器 + applyJavaFonts(fontInfo); + }); + + // 应用Java字体的函数 + function applyJavaFonts(fontInfo) { + const uiFonts = fontInfo.uiFonts || {}; + const defaultFont = fontInfo.defaultFont || uiFonts['Label.font'] || {}; + + if (defaultFont && defaultFont.family) { + const fontFamily = defaultFont.family; + const fontSize = defaultFont.size || 14; + const fontWeight = defaultFont.bold ? 'bold' : 'normal'; + const fontStyle = defaultFont.italic ? 'italic' : 'normal'; + + // 创建字体样式 + const style = document.createElement('style'); + style.textContent = ` + body, html { + font-family: '${fontFamily}', 'Fira Code', 'JetBrains Mono', monospace !important; + } + .toolbar, button, select { + font-family: '${fontFamily}', 'Fira Code', 'JetBrains Mono', monospace !important; + } + .log-item { + font-family: '${fontFamily}', 'Fira Code', 'JetBrains Mono', monospace !important; + font-size: ${fontSize}px !important; + } + .CodeMirror { + font-family: '${fontFamily}', 'Fira Code', 'JetBrains Mono', monospace !important; + font-size: ${fontSize}px !important; + } + `; + + // 添加到文档头 + document.head.appendChild(style); + + // 更新CodeMirror编辑器字体 + if (window.editor) { + editor.refresh(); // 刷新编辑器以应用新字体 + } + + console.log('Java字体已应用到HTML编辑器:', fontFamily, fontSize + 'px'); + } + } + + // 如果字体信息已经存在,立即应用 + if (typeof window.javaFontInfo !== 'undefined') { + applyJavaFonts(window.javaFontInfo); + } + window.javaMessageHandler = { loadContent: (content, fileName) => { editor.setValue(content); diff --git a/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java b/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java index 0109a1e..adde18c 100644 --- a/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java +++ b/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java @@ -1,5 +1,6 @@ package com.axis.innovators.box; +import com.axis.innovators.box.browser.WindowRegistry; import com.axis.innovators.box.events.GlobalEventBus; import com.axis.innovators.box.events.OpenFileEvents; import com.axis.innovators.box.events.StartupEvent; @@ -984,6 +985,7 @@ public class AxisInnovatorsBox { windowsJDialog.revalidate(); windowsJDialog.repaint(); } + WindowRegistry.getInstance().update(); ex.initUI(); ex.updateTheme(); ex.revalidate(); diff --git a/src/main/java/com/axis/innovators/box/browser/BrowserWindow.java b/src/main/java/com/axis/innovators/box/browser/BrowserWindow.java index 5a37af0..6ecd79e 100644 --- a/src/main/java/com/axis/innovators/box/browser/BrowserWindow.java +++ b/src/main/java/com/axis/innovators/box/browser/BrowserWindow.java @@ -2,6 +2,8 @@ package com.axis.innovators.box.browser; import com.axis.innovators.box.AxisInnovatorsBox; import com.axis.innovators.box.events.BrowserCreationCallback; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import org.cef.CefApp; import org.cef.CefClient; import org.cef.CefSettings; @@ -449,6 +451,9 @@ public class BrowserWindow extends JFrame { browser = client.createBrowser(htmlUrl, false, false); } + String fontInfo = getSystemFontsInfo(); + injectFontInfoToPage(browser, fontInfo); + Component browserComponent = browser.getUIComponent(); if (builder.browserCreationCallback != null) { boolean handled = builder.browserCreationCallback.onLayoutCustomization( @@ -554,6 +559,147 @@ public class BrowserWindow extends JFrame { return null; } + /** + * 更新主题 + */ + public void updateTheme() { + // 1. 获取Java字体信息 + String fontInfo = getSystemFontsInfo(); + injectFontInfoToPage(browser, fontInfo); + + // 2. 注入主题信息 + boolean isDarkTheme = AxisInnovatorsBox.getMain().getRegistrationTopic().isDarkMode(); + injectThemeInfoToPage(browser, isDarkTheme); + + //// 3. 刷新浏览器 + //SwingUtilities.invokeLater(() -> { + // browser.reload(); + //}); + } + + /** + * 获取Java字体信息(从UIManager获取) + */ + private String getSystemFontsInfo() { + try { + Gson gson = new Gson(); + JsonObject fontInfo = new JsonObject(); + JsonObject uiFonts = new JsonObject(); + + String[] fontKeys = { + "Label.font", "Button.font", "ToggleButton.font", "RadioButton.font", + "CheckBox.font", "ColorChooser.font", "ComboBox.font", "EditorPane.font", + "TextArea.font", "TextField.font", "PasswordField.font", "TextPane.font", + "FormattedTextField.font", "Table.font", "TableHeader.font", "List.font", + "Tree.font", "TabbedPane.font", "MenuBar.font", "Menu.font", "MenuItem.font", + "PopupMenu.font", "CheckBoxMenuItem.font", "RadioButtonMenuItem.font", + "Spinner.font", "ToolBar.font", "TitledBorder.font", "OptionPane.messageFont", + "OptionPane.buttonFont", "Panel.font", "Viewport.font", "ToolTip.font" + }; + + for (String key : fontKeys) { + Font font = UIManager.getFont(key); + if (font != null) { + JsonObject fontObj = new JsonObject(); + fontObj.addProperty("name", font.getFontName()); + fontObj.addProperty("family", font.getFamily()); + fontObj.addProperty("size", font.getSize()); + fontObj.addProperty("style", font.getStyle()); + fontObj.addProperty("bold", font.isBold()); + fontObj.addProperty("italic", font.isItalic()); + fontObj.addProperty("plain", font.isPlain()); + uiFonts.add(key, fontObj); + } + } + + fontInfo.add("uiFonts", uiFonts); + fontInfo.addProperty("timestamp", System.currentTimeMillis()); + fontInfo.addProperty("lookAndFeel", UIManager.getLookAndFeel().getName()); + + return gson.toJson(fontInfo); + } catch (Exception e) { + return "{\"error\": \"无法获取UIManager字体信息: " + e.getMessage() + "\"}"; + } + } + + /** + * 注入主题信息到页面 + */ + private void injectThemeInfoToPage(CefBrowser browser, boolean isDarkTheme) { + if (client == null) { + return; + } + + client.addLoadHandler(new CefLoadHandlerAdapter() { + @Override + public void onLoadEnd(CefBrowser browser, CefFrame frame, int httpStatusCode) { + String themeInfo = String.format( + "{\"isDarkTheme\": %s, \"timestamp\": %d}", + isDarkTheme, + System.currentTimeMillis() + ); + + String script = + "window.javaThemeInfo = " + themeInfo + ";\n" + + "console.log('Java theme information has been loaded:', window.javaThemeInfo);\n" + + "\n" + + "if (typeof applyJavaTheme === 'function') {\n" + + " applyJavaTheme(window.javaThemeInfo);\n" + + "}\n" + + "\n" + + "var event = new CustomEvent('javaThemeChanged', {\n" + + " detail: window.javaThemeInfo\n" + + "});\n" + + "document.dispatchEvent(event);\n" + + "console.log('The javaThemeChanged event is dispatched');"; + + browser.executeJavaScript(script, browser.getURL(), 0); + + browser.executeJavaScript( + "console.log('Theme information injection is complete,window.javaThemeInfo:', typeof window.javaThemeInfo);" + + "console.log('Number of theme event listeners:', document.eventListeners ? document.eventListeners('javaThemeChanged') : '无法获取');", + browser.getURL(), 0 + ); + } + }); + } + + /** + * 注入字体信息到页面并设置字体 + */ + private void injectFontInfoToPage(CefBrowser browser, String fontInfo) { + if (client == null) { + return; + } + client.addLoadHandler(new CefLoadHandlerAdapter() { + @Override + public void onLoadEnd(CefBrowser browser, CefFrame frame, int httpStatusCode) { + // 使用更简单的脚本来注入字体信息 + String script = + "if (typeof window.javaFontInfo === 'undefined') {" + + " window.javaFontInfo = " + fontInfo + ";" + + " console.log('Java font information has been loaded:', window.javaFontInfo);" + + " " + + " var event = new CustomEvent('javaFontsLoaded', {" + + " detail: window.javaFontInfo" + + " });" + + " document.dispatchEvent(event);" + + " console.log('The javaFontsLoaded event is dispatched');" + + "}"; + + browser.executeJavaScript(script, browser.getURL(), 0); + + // 添加调试信息 + browser.executeJavaScript( + "console.log('Font information injection is complete,window.javaFontInfo:', typeof window.javaFontInfo);" + + "console.log('Number of event listeners:', document.eventListeners ? document.eventListeners('javaFontsLoaded') : '无法获取');", + browser.getURL(), 0 + ); + } + }); + + } + public static void printStackTrace() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); for (int i = 2; i < stackTrace.length; i++) { diff --git a/src/main/java/com/axis/innovators/box/browser/BrowserWindowJDialog.java b/src/main/java/com/axis/innovators/box/browser/BrowserWindowJDialog.java index a500ea1..b68c87c 100644 --- a/src/main/java/com/axis/innovators/box/browser/BrowserWindowJDialog.java +++ b/src/main/java/com/axis/innovators/box/browser/BrowserWindowJDialog.java @@ -2,6 +2,8 @@ package com.axis.innovators.box.browser; import com.axis.innovators.box.AxisInnovatorsBox; import com.axis.innovators.box.events.BrowserCreationCallback; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import org.cef.CefApp; import org.cef.CefClient; import org.cef.CefSettings; @@ -13,6 +15,7 @@ import org.cef.callback.CefMenuModel; import org.cef.callback.CefQueryCallback; import org.cef.handler.*; import org.cef.network.CefRequest; +import org.json.JSONObject; import javax.swing.*; import java.awt.*; @@ -86,6 +89,7 @@ public class BrowserWindowJDialog extends JDialog { this.title = title; return this; } + /** * 设置链接打开方式 * @@ -442,6 +446,7 @@ public class BrowserWindowJDialog extends JDialog { Thread.currentThread().setName("BrowserRenderThread"); + // 4. 加载HTML if (htmlUrl.isEmpty()) { String fileUrl = new File(htmlPath).toURI().toURL().toString(); @@ -486,6 +491,9 @@ public class BrowserWindowJDialog extends JDialog { } } + String fontInfo = getSystemFontsInfo(); + injectFontInfoToPage(browser, fontInfo); + CefMessageRouter.CefMessageRouterConfig config = new CefMessageRouter.CefMessageRouterConfig(); config.jsQueryFunction = "javaQuery";// 定义方法 config.jsCancelFunction = "javaQueryCancel";// 定义取消方法 @@ -525,6 +533,8 @@ public class BrowserWindowJDialog extends JDialog { } }); + + dragPanel.add(titleBar, BorderLayout.NORTH); getContentPane().add(dragPanel, BorderLayout.CENTER); getContentPane().add(browserComponent, BorderLayout.CENTER); @@ -561,6 +571,145 @@ public class BrowserWindowJDialog extends JDialog { return null; } + /** + * 更新主题 + */ + public void updateTheme() { + // 1. 获取Java字体信息 + String fontInfo = getSystemFontsInfo(); + injectFontInfoToPage(browser, fontInfo); + + // 2. 注入主题信息 + boolean isDarkTheme = AxisInnovatorsBox.getMain().getRegistrationTopic().isDarkMode(); + injectThemeInfoToPage(browser, isDarkTheme); + + //// 3. 刷新浏览器 + //SwingUtilities.invokeLater(() -> { + // browser.reload(); + //}); + } + private void injectThemeInfoToPage(CefBrowser browser, boolean isDarkTheme) { + if (client == null) { + return; + } + + client.addLoadHandler(new CefLoadHandlerAdapter() { + @Override + public void onLoadEnd(CefBrowser browser, CefFrame frame, int httpStatusCode) { + String themeInfo = String.format( + "{\"isDarkTheme\": %s, \"timestamp\": %d}", + isDarkTheme, + System.currentTimeMillis() + ); + + String script = + "window.javaThemeInfo = " + themeInfo + ";\n" + + "console.log('Java theme information has been loaded:', window.javaThemeInfo);\n" + + "\n" + + "if (typeof applyJavaTheme === 'function') {\n" + + " applyJavaTheme(window.javaThemeInfo);\n" + + "}\n" + + "\n" + + "var event = new CustomEvent('javaThemeChanged', {\n" + + " detail: window.javaThemeInfo\n" + + "});\n" + + "document.dispatchEvent(event);\n" + + "console.log('The javaThemeChanged event is dispatched');"; + + browser.executeJavaScript(script, browser.getURL(), 0); + + browser.executeJavaScript( + "console.log('Theme information injection is complete,window.javaThemeInfo:', typeof window.javaThemeInfo);" + + "console.log('Number of theme event listeners:', document.eventListeners ? document.eventListeners('javaThemeChanged') : '无法获取');", + browser.getURL(), 0 + ); + } + }); + } + + + /** + * 获取Java字体信息(从UIManager获取) + */ + private String getSystemFontsInfo() { + try { + Gson gson = new Gson(); + JsonObject fontInfo = new JsonObject(); + JsonObject uiFonts = new JsonObject(); + + String[] fontKeys = { + "Label.font", "Button.font", "ToggleButton.font", "RadioButton.font", + "CheckBox.font", "ColorChooser.font", "ComboBox.font", "EditorPane.font", + "TextArea.font", "TextField.font", "PasswordField.font", "TextPane.font", + "FormattedTextField.font", "Table.font", "TableHeader.font", "List.font", + "Tree.font", "TabbedPane.font", "MenuBar.font", "Menu.font", "MenuItem.font", + "PopupMenu.font", "CheckBoxMenuItem.font", "RadioButtonMenuItem.font", + "Spinner.font", "ToolBar.font", "TitledBorder.font", "OptionPane.messageFont", + "OptionPane.buttonFont", "Panel.font", "Viewport.font", "ToolTip.font" + }; + + for (String key : fontKeys) { + Font font = UIManager.getFont(key); + if (font != null) { + JsonObject fontObj = new JsonObject(); + fontObj.addProperty("name", font.getFontName()); + fontObj.addProperty("family", font.getFamily()); + fontObj.addProperty("size", font.getSize()); + fontObj.addProperty("style", font.getStyle()); + fontObj.addProperty("bold", font.isBold()); + fontObj.addProperty("italic", font.isItalic()); + fontObj.addProperty("plain", font.isPlain()); + uiFonts.add(key, fontObj); + } + } + + fontInfo.add("uiFonts", uiFonts); + fontInfo.addProperty("timestamp", System.currentTimeMillis()); + fontInfo.addProperty("lookAndFeel", UIManager.getLookAndFeel().getName()); + + return gson.toJson(fontInfo); + } catch (Exception e) { + return "{\"error\": \"无法获取UIManager字体信息: " + e.getMessage() + "\"}"; + } + } + + /** + * 注入字体信息到页面并设置字体 + */ + private void injectFontInfoToPage(CefBrowser browser, String fontInfo) { + if (client == null) { + return; + } + client.addLoadHandler(new CefLoadHandlerAdapter() { + @Override + public void onLoadEnd(CefBrowser browser, CefFrame frame, int httpStatusCode) { + // 使用更简单的脚本来注入字体信息 + String script = + "if (typeof window.javaFontInfo === 'undefined') {" + + " window.javaFontInfo = " + fontInfo + ";" + + " console.log('Java font information has been loaded:', window.javaFontInfo);" + + " " + + " var event = new CustomEvent('javaFontsLoaded', {" + + " detail: window.javaFontInfo" + + " });" + + " document.dispatchEvent(event);" + + " console.log('The javaFontsLoaded event is dispatched');" + + "}"; + + System.out.println("正在注入字体信息到页面..."); + browser.executeJavaScript(script, browser.getURL(), 0); + + // 添加调试信息 + browser.executeJavaScript( + "console.log('Font information injection is complete,window.javaFontInfo:', typeof window.javaFontInfo);" + + "console.log('Number of event listeners:', document.eventListeners ? document.eventListeners('javaFontsLoaded') : '无法获取');", + browser.getURL(), 0 + ); + } + }); + + } + public static void printStackTrace() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); for (int i = 2; i < stackTrace.length; i++) { diff --git a/src/main/java/com/axis/innovators/box/browser/MainApplication.java b/src/main/java/com/axis/innovators/box/browser/MainApplication.java index f8f9622..95ec6aa 100644 --- a/src/main/java/com/axis/innovators/box/browser/MainApplication.java +++ b/src/main/java/com/axis/innovators/box/browser/MainApplication.java @@ -87,6 +87,7 @@ public class MainApplication { } }, true); } + }); } diff --git a/src/main/java/com/axis/innovators/box/browser/WindowRegistry.java b/src/main/java/com/axis/innovators/box/browser/WindowRegistry.java index 626ffc8..067c7de 100644 --- a/src/main/java/com/axis/innovators/box/browser/WindowRegistry.java +++ b/src/main/java/com/axis/innovators/box/browser/WindowRegistry.java @@ -57,6 +57,20 @@ public class WindowRegistry { return windows.get(windowId); } + public void update() { + for (BrowserWindow window : windows.values()) { + if (window != null) { + window.updateTheme(); + } + } + + for (BrowserWindowJDialog window : childWindows.values()) { + if (window != null) { + window.updateTheme(); + } + } + } + /** * 创建一个新的窗口 * @param windowId 窗口ID