# Todo-Java-CEF
**Repository Path**: arkxos-opensource/Todo-Java-CEF
## Basic Information
- **Project Name**: Todo-Java-CEF
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-09
- **Last Updated**: 2025-11-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Todo-Java-CEF 脚手架
Java + Chromium = 现代桌面应用
一个功能完善的Java Chromium Embedded Framework(JCEF)桌面应用脚手架,提供嵌入式Chromium浏览器与Java Swing的无缝集成。



## 项目简介
Todo-Java-CEF是一个开源的桌面应用脚手架,使用JCEF将Chromium浏览器嵌入到Java Swing窗口中,实现Web内容的展示和交互。该脚手架提供了一套完整的基础设施,包括窗口管理、系统托盘、全局快捷键、JavaScript交互等功能,让开发者可以快速构建基于Web技术的桌面应用。
### 为什么选择Todo-Java-CEF?
- **现代Web技术** - 使用HTML5、CSS3和JavaScript构建UI,同时保留Java的强大后端能力
- **跨平台兼容** - 支持Windows、macOS和Linux
- **开箱即用** - 预配置了常用功能,无需从零开始
- **高性能** - 使用Chromium渲染引擎,确保Web内容的高性能展示
- **易于扩展** - 模块化设计,便于添加自定义功能
## 技术栈
- **Java 17+** - 利用现代Java特性
- **Swing** - 经典Java GUI框架
- **JCEF** - Java Chromium Embedded Framework
- **Maven** - 项目构建和依赖管理
- **Gson** - JSON处理
- **SLF4J/Logback** - 日志框架
## 核心功能
### 基础功能
- **嵌入式Chromium浏览器** - 在Java Swing窗口中无缝集成现代Web浏览器
- **本地CEF加载** - 使用本地安装的CEF,避免网络下载问题
- **环境适配** - 自动识别开发/生产环境,分别加载开发服务器或本地静态文件
### 系统集成
- **系统托盘集成**
- 自定义托盘图标和菜单
- 托盘通知功能
- 双击托盘图标显示/隐藏主窗口
- **窗口管理**
- 窗口最小化到托盘
- 窗口显示/隐藏控制
- 窗口关闭事件自定义处理
- **全局快捷键** - 通过快捷键组合控制应用窗口
### 交互功能
- **JavaScript交互**
- 从Java执行JavaScript代码
- 通过消息路由器实现JavaScript与Java的双向通信
- **事件处理**
- 键盘焦点事件监听
- 鼠标点击事件处理
- 窗口状态变化监听
### 高级特性
- **CEF高级配置**
- 透明背景支持
- GPU渲染控制
- 沙箱配置
- **资源管理** - 应用关闭时自动释放CEF资源
- **日志系统** - 集成SLF4J日志框架,提供详细运行日志
## 安装与使用
### 系统要求
- JDK 17或更高版本
- 支持的操作系统:Windows、macOS、Linux
- 至少4GB RAM(推荐8GB或更多)
- 至少200MB可用磁盘空间(不包括CEF二进制文件)
### 获取CEF二进制文件
CEF二进制文件是运行应用的必要组件,但由于文件较大,不包含在代码仓库中。您需要手动下载并放置在正确位置:
1. 访问 [JCEF Maven Releases](https://github.com/jcefmaven/jcefmaven/releases) 下载与您操作系统匹配的CEF二进制文件
2. 解压下载的文件
3. 将解压后的文件夹重命名为`runtimes`并放置在项目根目录下
> **注意**:确保下载的CEF版本与项目中使用的JCEF Maven版本兼容
### 快速开始
1. 克隆仓库
```bash
git clone https://github.com/yourusername/todo-java-cef.git
cd todo-java-cef
```
2. 确保CEF二进制文件已放置在`runtimes`目录下
3. 使用Maven构建和运行
```bash
mvn clean compile exec:java
```
### 开发模式
脚手架支持两种运行模式:
- **开发模式**:加载`http://localhost:3000/index.html`,适合前端开发调试
- **生产模式**:加载本地静态文件`/static/index.html`,适合打包发布
通过环境变量 `app.env`的值 `dev` `prod` 在两种模式间切换:
## 项目结构
```
todo-java-cef/
├── runtimes/ # CEF二进制文件目录
│ └── windows-amd64/
│ ├── swiftshader/
│ ├── jcef.dll
│ ├── ...
│ └── macos-amd64/
│ ├── swiftshader/
│ ├── jcef.dll
│ ├── ...
│ └── linux-amd64/
│ ├── swiftshader/
│ ├── jcef.dll/
│ ├── ...
│ └── ...
├── static/ # 生产环境静态资源目录
│ └── index.html # 主页面
├── src/
│ └── main/
│ ├── java/
│ │ └── org/
│ │ └── demo/
│ │ ├── Main.java # 主入口类
│ │ └── common/ # 通用工具类
│ │ ├── AppConstant.java # 应用常量,通用方法
│ │ ├── AppEnum.java # 环境变量
│ │ ├── FrameVisibleManager.java # 窗体快捷键
│ │ ├── KeyboardHandler.java # 键盘事件处理
│ │ ├── LogUtil.java # 日志工具
│ │ ├── MyCefLoadHandler.java # CEF加载处理
│ │ ├── MyCefMessageRouterHandler.java # 消息路由处理
│ │ └── TrayDialog.java # 托盘对话框
│ └── resources/
│ └── logback.xml # 日志配置
└── pom.xml # Maven构建配置文件
```
## 自定义开发指南
### 修改应用名称和窗口大小
在`Main.java`中修改相关常量:
```java
// 修改应用名称
private static final String APP_NAME = "你的应用名称";
// 修改窗口大小
mainFrame.setSize(1024, 768); // 宽度, 高度
```
### 修改加载的URL
在`Main.java`中修改`pageUrl`变量:
```java
// 开发环境
pageUrl = "http://localhost:你的端口/index.html";
// 生产环境
pageUrl = "file:///" + staticDir.replace('\\', '/') + "/你的页面.html";
```
### JavaScript与Java交互
#### 从Java调用JavaScript
```java
// 在Java代码中执行JavaScript
browser.executeJavaScript(
"document.getElementById('myElement').innerHTML = '来自Java的数据';",
browser.getURL(),
0
);
```
#### 从JavaScript调用Java
1. 在`MyCefMessageRouterHandler.java`中添加处理方法:
```java
@Override
public boolean onQuery(CefBrowser browser, CefFrame frame, long queryId,
String request, boolean persistent, CefQueryCallback callback) {
// 解析来自JavaScript的请求
try {
JSONObject jsonRequest = new JSONObject(request);
String action = jsonRequest.getString("action");
if ("greeting".equals(action)) {
String name = jsonRequest.getString("name");
String response = "你好, " + name + "!";
// 发送响应回JavaScript
callback.success(response);
return true;
}
} catch (Exception e) {
logger.error("处理JavaScript查询时出错", e);
callback.failure(0, e.getMessage());
}
return false;
}
```
2. 在JavaScript中调用Java方法:
```javascript
// 从JavaScript调用Java
window.cefQuery({
request: JSON.stringify({
action: "greeting",
name: "世界"
}),
onSuccess: function(response) {
console.log("来自Java的响应:", response);
alert(response);
},
onFailure: function(error_code, error_message) {
console.error("调用Java失败:", error_message);
}
});
```
### 自定义托盘菜单
在`Main.java`中修改托盘菜单:
```java
// 添加自定义菜单项
popupMenu.add(AppConstant.createJMenuItem("设置", e -> {
logger.info("点击自定义菜单");
}));
```
### 全局快捷键配置
修改`FrameVisibleManager`类中的快捷键组合:
```java
// 示例:修改为Alt+M
private static final int HOTKEY_MODIFIER = NativeKeyEvent.VC_ALT;
private static final int HOTKEY_KEYCODE = NativeKeyEvent.VC_M;
```
## 打包与发布
### 使用Maven打包
创建可执行JAR文件:
```bash
mvn clean package
```
这将在`target`目录下生成一个可执行的JAR文件。并在build目录下生成所有需要的文件.
在build目录下使用java -jar todo-java-cef-1.0-SNAPSHOT.jar 执行构建后程序
### 创建本机安装程序 (还未测试)
推荐使用[jpackage](https://docs.oracle.com/en/java/javase/17/docs/specs/man/jpackage.html)(JDK 16+内置)创建本机安装程序:
```bash
jpackage --input target/ \
--name "Todo App" \
--main-jar todo-java-cef-1.0-SNAPSHOT.jar \
--main-class org.demo.Main \
--type dmg \ # 根据平台选择:dmg, pkg, exe, msi, deb, rpm
--icon path/to/icon.icns \
--app-version 1.0.0
```
> **注意**:打包时需要确保CEF二进制文件被正确包含在最终的安装包中
## 常见问题解答(FAQ)
### Q: 应用启动时出现"找不到CEF二进制文件"错误
**A**: 确保您已下载正确版本的CEF二进制文件,并将其放置在项目根目录的`runtimes`文件夹中。检查文件夹名称是否正确(注意大小写)。
注意下载jar包版本 110.0.25
国内可以通过 https://maven.aliyun.com/mvn/search 使用关键字 `jcef-natives` 搜索下载
### Q: 应用启动后显示白屏
**A**: 这通常是由于CEF渲染问题导致的。尝试在`Main.java`中添加以下CEF参数:
```java
builder.addJcefArgs("--disable-gpu");
builder.addJcefArgs("--disable-gpu-compositing");
builder.addJcefArgs("--disable-software-rasterizer");
builder.addJcefArgs("--in-process-gpu");
```
### Q: 如何调试JavaScript和Java之间的通信?
**A**: 在开发模式下,您可以使用浏览器的开发者工具进行调试。同时,在Java端添加详细的日志记录:
```java
logger.debug("收到来自JavaScript的请求: {}", request);
```
## 性能优化建议
1. **减少JavaScript和Java之间的通信频率** - 批量处理请求而不是频繁调用
2. **优化CEF设置** - 根据应用需求调整CEF参数
3. **使用Web Workers** - 对于复杂的JavaScript计算,使用Web Workers避免阻塞UI线程
4. **资源预加载** - 在应用启动时预加载常用资源
5. **内存管理** - 及时释放不再使用的资源,特别是大型对象
## 贡献指南
欢迎提交Issue和Pull Request来改进这个脚手架项目。请确保您的代码符合项目的编码规范和最佳实践。
1. Fork本仓库
2. 创建您的特性分支 (`git checkout -b feature/amazing-feature`)
3. 提交您的更改 (`git commit -m 'Add some amazing feature'`)
4. 推送到分支 (`git push origin feature/amazing-feature`)
5. 打开一个Pull Request
## 许可证
本项目采用MIT许可证,详情请参阅LICENSE文件。
## 致谢
- [JCEF Maven](https://github.com/jcefmaven/jcefmaven) - 提供Java CEF的Maven集成
- [Chromium Embedded Framework](https://bitbucket