🖌️ 环境:
-
✅ Windows 11
-
✅ Maven 3.9.11
-
✅ IDEA
-
✅ JDK 17
-
✅ 使用
jcefmaven
⚙️⚙️⚙️ 入门项目 ⚙️⚙️⚙️
👉 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>jcef-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- JCEF核心依赖 -->
<dependency>
<groupId>me.friwi</groupId>
<artifactId>jcefmaven</artifactId>
<version>122.1.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
👉 JcefDemo
package cn.why;
import me.friwi.jcefmaven.CefAppBuilder;
import me.friwi.jcefmaven.MavenCefAppHandlerAdapter;
import org.cef.CefApp;
import org.cef.CefClient;
import org.cef.browser.CefBrowser;
import org.cef.browser.CefFrame;
import org.cef.handler.CefDisplayHandlerAdapter;
import org.cef.handler.CefLoadHandlerAdapter;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* 入门
*/
public class O1_JcefDemo {
public static void main(String[] args) {
// 1. 创建主窗口
JFrame frame = new JFrame("JCEF Simple Browser");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setSize(1200, 800);
frame.setLayout(new BorderLayout());
try {
// 2. 使用 CefAppBuilder 初始化 CEF(这会自动处理本地库)
CefAppBuilder builder = new CefAppBuilder();
// 配置 CEF
builder.setAppHandler(new MavenCefAppHandlerAdapter() {
@Override
public void stateHasChanged(org.cef.CefApp.CefAppState state) {
if (state == CefApp.CefAppState.TERMINATED) {
System.exit(0);
}
}
});
// 安装并初始化 CEF
builder.getCefSettings().windowless_rendering_enabled = false;
CefApp cefApp = builder.build();
// 3. 创建客户端
CefClient client = cefApp.createClient();
// 4. 添加显示处理器(监听标题变化)
client.addDisplayHandler(new CefDisplayHandlerAdapter() {
@Override
public void onTitleChange(CefBrowser browser, String title) {
SwingUtilities.invokeLater(() -> {
frame.setTitle("JCEF Browser - " + title);
});
}
@Override
public void onAddressChange(CefBrowser browser, CefFrame cefFrame, String url) {
System.out.println("URL changed: " + url);
}
});
// 5. 添加加载处理器
client.addLoadHandler(new CefLoadHandlerAdapter() {
@Override
public void onLoadingStateChange(CefBrowser browser, boolean isLoading,
boolean canGoBack, boolean canGoForward) {
if (!isLoading) {
System.out.println("Page loaded successfully!");
}
}
});
// 6. 创建浏览器实例
CefBrowser browser = client.createBrowser(
"https://www.baidu.com", // 初始URL
false, // 不使用OSR(离屏渲染)
false // 不透明
);
// 7. 获取浏览器UI组件并添加到窗口
Component browserUI = browser.getUIComponent();
frame.add(browserUI, BorderLayout.CENTER);
// 8. 创建工具栏
JPanel toolbar = createToolbar(browser);
frame.add(toolbar, BorderLayout.NORTH);
// 9. 处理窗口关闭事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
cefApp.dispose();
frame.dispose();
}
});
// 10. 显示窗口
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(
frame,
"初始化JCEF失败: " + e.getMessage(),
"错误",
JOptionPane.ERROR_MESSAGE
);
System.exit(1);
}
}
// 创建简单的工具栏
private static JPanel createToolbar(CefBrowser browser) {
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
// 后退按钮
JButton backBtn = new JButton("← 后退");
backBtn.addActionListener(e -> browser.goBack());
// 前进按钮
JButton forwardBtn = new JButton("前进 →");
forwardBtn.addActionListener(e -> browser.goForward());
// 刷新按钮
JButton reloadBtn = new JButton("⟳ 刷新");
reloadBtn.addActionListener(e -> browser.reload());
// 地址栏
JTextField urlField = new JTextField(50);
urlField.setText("https://www.baidu.com");
urlField.addActionListener(e -> {
String url = urlField.getText();
if (!url.startsWith("http")) {
url = "https://" + url;
}
browser.loadURL(url);
});
// Go按钮
JButton goBtn = new JButton("Go");
goBtn.addActionListener(e -> {
String url = urlField.getText();
if (!url.startsWith("http")) {
url = "https://" + url;
}
browser.loadURL(url);
});
panel.add(backBtn);
panel.add(forwardBtn);
panel.add(reloadBtn);
panel.add(new JLabel("URL:"));
panel.add(urlField);
panel.add(goBtn);
return panel;
}
}
👉 执行过程
启动项目,控制台打印:
"C:\Program Files\Java\jdk-17\bin\java.exe" --add-opens java.desktop/sun.awt=ALL-UNNAMED --add-opens java.desktop/java.awt.peer=ALL-UNNAMED "-javaagent:C:\Users\why\AppData\Local\Programs\IntelliJ IDEA\lib\idea_rt.jar=54855" -Dfile.encoding=UTF-8 -classpath C:\Users\why\klProjects\jcef-demo\target\classes;C:\Users\why\.m2\repository\me\friwi\jcefmaven\122.1.10\jcefmaven-122.1.10.jar;C:\Users\why\.m2\repository\me\friwi\jcef-api\jcef-0b8e42e+cef-122.1.10+gc902316+chromium-122.0.6261.112\jcef-api-jcef-0b8e42e+cef-122.1.10+gc902316+chromium-122.0.6261.112.jar;C:\Users\why\.m2\repository\me\friwi\jogl-all\v2.4.0-rc-20210111\jogl-all-v2.4.0-rc-20210111.jar;C:\Users\why\.m2\repository\me\friwi\gluegen-rt\v2.4.0-rc-20210111\gluegen-rt-v2.4.0-rc-20210111.jar;C:\Users\why\.m2\repository\org\apache\commons\commons-compress\1.21\commons-compress-1.21.jar;C:\Users\why\.m2\repository\com\google\code\gson\gson\2.10\gson-2.10.jar com.example.SimpleBrowser
1月 21, 2026 4:31:24 下午 me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler handleProgress
信息: LOCATING |> In progress...
1月 21, 2026 4:31:24 下午 me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler handleProgress
信息: DOWNLOADING |> In progress...
1月 21, 2026 4:31:26 下午 me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler handleProgress
信息: DOWNLOADING |> 0.0
1月 21, 2026 4:31:38 下午 me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler handleProgress
信息: DOWNLOADING |> 1.0
...
1月 21, 2026 4:57:10 下午 me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler handleProgress
信息: DOWNLOADING |> 98.0
1月 21, 2026 4:57:29 下午 me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler handleProgress
信息: DOWNLOADING |> 99.0
1月 21, 2026 4:57:47 下午 me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler handleProgress
信息: DOWNLOADING |> 100.0
1月 21, 2026 4:57:47 下午 me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler handleProgress
信息: EXTRACTING |> In progress...
1月 21, 2026 4:57:50 下午 me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler handleProgress
信息: INSTALL |> In progress...
1月 21, 2026 4:57:50 下午 me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler handleProgress
信息: INITIALIZING |> In progress...
1月 21, 2026 4:57:53 下午 me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler handleProgress
信息: INITIALIZED |> In progress...
initialize on Thread[AWT-EventQueue-0,6,main] with library path C:\Users\why\klProjects\jcef-demo\jcef-bundle
[0121/165753.746:WARNING:resource_util.cc(94)] Please customize CefSettings.root_cache_path for your application. Use of the default value may lead to unintended process singleton behavior.
URL changed: https://www.baidu.com/
Page loaded successfully!
日志显示:
-
✅ LOCATING - 定位资源
-
✅ DOWNLOADING - 正在下载(0.0%刚开始) ,百分比逐渐增加
浏览器窗口:

1634

被折叠的 条评论
为什么被折叠?



