三、入门Demo

🖌️ 环境:

  • 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%刚开始) ,百分比逐渐增加


浏览器窗口:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别晃我的可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值