JCEF中js与java交互、js与java相互调用

news2024/12/23 6:51:24

jcef中js与java相互调用,java与js相互调用,chrome与java相互调用,java与chrome相互调用、jcef与java相互调用

前提:https://blog.csdn.net/weixin_44480167/article/details/133170970(java内嵌浏览器CEF-JAVA、jcef、java chrome)

转自:https://lingkang.top/archives/jcef-zhong-js-yu-java-jiao-hu

代码如下

package top.lingkang;

import me.friwi.jcefmaven.CefAppBuilder;
import me.friwi.jcefmaven.CefBuildInfo;
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.browser.CefMessageRouter;
import org.cef.callback.CefQueryCallback;
import org.cef.handler.CefMessageRouterHandlerAdapter;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

/**
 * @author lingkang
 * @created in 2023/9/22
 **/
public class Demo02 {
    public static void main(String[] args) throws Exception {
        CefAppBuilder builder = new CefAppBuilder();
        // window下不需要OSR
        boolean useOSR = false;
        builder.getCefSettings().windowless_rendering_enabled = useOSR;
        builder.setAppHandler(new MavenCefAppHandlerAdapter() {
            @Override
            public void stateHasChanged(org.cef.CefApp.CefAppState state) {
                // 关闭应用时退出jvm运行
                if (state == CefApp.CefAppState.TERMINATED) System.exit(0);
            }
        });

        // 设置cef运行参数,这里为空
        builder.addJcefArgs(args);

        // 设置 cef chrome实例的目录,关键,若不设置他会默认从网络中下载,国外网络可能下载不稳定导致失败
        // 我的 cef chrome 位于项目的chrome目录下 C:\Users\Administrator\Desktop\project\java\demo-desktop\chrome
        builder.setInstallDir(new File(System.getProperty("user.dir") + File.separator + "chrome"));
        // 由于是手动设置cef的chrome,我们要跳过ins检查,防止版本不一致导致从镜像站下载
        builder.setSkipInstallation(true);

        // 全局的 CefApp 每个程序只能有一个,线程安全
        CefApp build = builder.build();
        // 显示一些版本信息
        CefBuildInfo buildInfo = CefBuildInfo.fromClasspath();
        System.out.println(buildInfo);
        CefApp.CefVersion cefVersion = build.getVersion();
        System.out.println(cefVersion);

        // 创建一个浏览器客户端实例
        CefClient client = build.createClient();

        // 添加一个方法用于html调用它,在html中执行 window.javaQuery({...})
        CefMessageRouter.CefMessageRouterConfig config = new CefMessageRouter.CefMessageRouterConfig();
        config.jsQueryFunction = "javaQuery";// 定义方法
        config.jsCancelFunction = "javaQueryCancel";// 定义取消方法
        CefMessageRouter messageRouter = CefMessageRouter.create(config);
        messageRouter.addHandler(new CefMessageRouterHandlerAdapter() {
            @Override
            public boolean onQuery(CefBrowser browser, CefFrame frame, long queryId, String request, boolean persistent, CefQueryCallback callback) {
                if ("my_call".equals(request)){
                    // 返回影响成功的数据
                    callback.success("get java data success!");
                    browser.executeJavaScript("htmlFun('哈哈')",null,2);// 调用js中定义的方法
                    // callback.failure();
                    return true;
                }
                return false;
            }
        }, false);
        client.addMessageRouter(messageRouter);

        boolean isTransparent = true;// 透明背景
        // src/main/resources/index.html
        String path = Demo02.class.getResource("/index.html").getPath();// 返回的是一个 url 对象路径
        path=path.substring(1);
        // 创建一个浏览器实例
        CefBrowser browser = client.createBrowser(path, useOSR, isTransparent);
        // 获取UI组件
        Component uiComponent = browser.getUIComponent();

        // 创建 JFrame UI 用于放入chrome
        JFrame main = new JFrame("lingkang");
        main.getContentPane().add(uiComponent, BorderLayout.CENTER);
        main.setSize(800, 600);//大小
        main.setLocation(0, 0);//位置

        main.setVisible(true);//显示
        main.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                // 关闭应用时要释放资源
                CefApp.getInstance().dispose();
                main.dispose();
                System.exit(0);//0正常退出,1非正常退出
            }
        });

    }
}

src/main/resources/index.html如下

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button onclick="callJava()">调用java的javaQuery方法</button>
<script>
    // JavaScript调用java中的方法
    function callJava(){
      window.javaQuery({
        request: 'my_call',
        persistent: false,
        onSuccess: function(response) { alert(response) },
        onFailure: function(error_code, error_message) {}
        })
    }

    // java调用JavaScript中的方法
    function htmlFun(v){
      console.log(v)
    }
</script>
</body>
</html>

效果
在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1031477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天玑科技PBData信创数据库私有云平台荣获“专题展优秀成果奖”

9月15-16日&#xff0c;由湖南省人民政府、工业和信息化部联合主办的2023世界计算大会在湖南长沙盛大启幕。天玑科技作为云服务、信息技术应用创新领域优秀的解决方案提供商受邀参会参展。 大会以“计算万物 湘约未来——计算产业新变革”为主题&#xff0c;全国政协副主席、民…

GE IS420UCSCH2A-C-V0.1-A模拟量输入模块

GE IS420UCSCH2A-C-V0.1-A 模拟量输入模块是一种用于数据采集和监测的电子模块&#xff0c;通常应用于工业控制系统、监测设备和自动化系统中。以下是可能与该模拟量输入模块相关的一些产品特点&#xff1a; 多通道输入&#xff1a; GE IS420UCSCH2A-C-V0.1-A 模拟量输入模块通…

这个世界,永远靠实力说话

这个世界&#xff0c;永远靠实力说话。与其寄望于运气或机会的降临&#xff0c;还不如脚踏实地&#xff0c;努力提升自己。因为只有强者&#xff0c;才能在这个充满挑战和机遇的世界里谈笑风生&#xff0c;创造出属于自己的成功和辉煌。 就比如峰民dyfm888给人取名改名&#x…

基于Java的Base64编解码优化探讨

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

腾讯云16核CPU服务器配置大全,CVM和轻量服务器

腾讯云16核CPU服务器有哪些配置可以选择&#xff1f;可以选择标准型S6、标准型SA3、计算型C6或标准型S5等&#xff0c;目前标准型S5云服务器有优惠活动&#xff0c;性价比高&#xff0c;计算型C6云服务器16核性能更高&#xff0c;轻量16核32G28M带宽优惠价3468元15个月&#xf…

如何搭建数据驱动自动化测试框架?

前言 说到数据驱动自动化测试&#xff0c;你会不会有这样的疑问&#xff1a;数据怎么管理&#xff1f;数据怎么才能驱动测试用例执行&#xff1f;到底怎么样才算数据驱动&#xff1f;那么本篇文章就教你如何进行数据驱动测试&#xff0c;相信你一定能对数据驱动自动化测试有一…

【Java 集合】常用的Java集合框架体系详解(134)

一、集合的体系 概述&#xff1a;java中存储对象数据的一种容器&#xff0c;集合只能存储引用类型的数据。用泛型来规定需要操作元素的数据类型&#xff0c;可以在编译阶段约束集合只能操作某种数据类型。集合分为两个家族 MAP和Collection 特点&#xff1a;大小不固定&#…

YOLOv8 YOLOv7 YOLOv5 训练 SCB-Dataset3-U

目录 0 相关资料1 SCB-Dataset3-U 数据2 YOLOv8 训练2.1 YOLOv8 安装2.2 训练的yaml文件2.3 YOLOv8 训练2.3.1 yolov8n 训练2.3.2 yolov8n 验证 0 相关资料 YOLOV8环境安装教程.&#xff1a;https://www.bilibili.com/video/BV1dG4y1c7dH/ YOLOV8保姆级教学视频:https://www.…

实施预测性维护解决方案的挑战及PreMaint的应对方法

前面我们介绍了企业选择预测性维护解决方案的常见问题和PreMaint的策略&#xff0c;本期我们将带来实施过程中可能会遇到的挑战&#xff0c;以及如何通过PreMaint来应对这些挑战&#xff0c;以实现可靠的预测性维护。 随着工业技术的不断进步&#xff0c;预测性维护作为一种先进…

【C语言】结构体内存对齐机制详解

目录 一、前言二、结构体内存对齐规则三、实例解析 一、前言 在讲解结构体内存对齐机制之前&#xff0c;我们先来看1个例子&#xff1a; typedef struct {char sex; // 性别int id; // 学号char name[20]; // 姓名float score; // 成绩char addr[30]; …

中秋特辑——3D动态礼盒贺卡(可监听鼠标移动)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

华纳云:如何搭建Nginx服务器做到负载均衡

要搭建Nginx服务器实现负载均衡&#xff0c;您可以使用Nginx作为反向代理来分发客户端请求到多个后端服务器。以下是一个基本的步骤指南&#xff1a; 前提条件&#xff1a; 您需要一台安装有Nginx的服务器。您需要有多台后端服务器&#xff0c;这些服务器将处理客户端请求。 …

centos7 装机遇到的问题

centos7 U盘启动装机 设置完启动项后重启 在菜单界面选择install centos7 按e编辑启动项&#xff0c;修改成如下 --> 之所以这么改是u盘的LABEL超过长度了只能显示到x8这里&#xff0c;nomodeset 是disable 视频驱动比如gpu 开始安装后如果选择的硬盘没有多余的空间了会提…

TikTok的媒体革命:新闻业如何适应短视频时代?

在数字时代&#xff0c;媒体行业一直在不断演变和创新&#xff0c;以适应观众的变化需求和技术的发展。而在这个进化的过程中&#xff0c;短视频应用TikTok已经崭露头角&#xff0c;成为了一个重要的信息传播平台。 这篇文章将深入探讨TikTok如何引领了媒体的一场革命&#xf…

mininum_snap

位置 速度 加速度 角度 jerk 角速度 驱动力 snap 角加速度 推力的导数 凸优化算法 convex optimization 凸优化&#xff08;Convex Optimization&#xff09;是数学和计算机科学领域的一个重要分支&#xff0c;主要研究如何有效地解决凸优化问题。凸优化问题的主要目标是找…

pytest进阶之conftest.py

前言 前面几篇随笔基本上已经了解了pytest 命令使用&#xff0c;收集用例&#xff0c;finxture使用及作用范围&#xff0c;今天简单介绍一下conftest.py文件的作用和实际项目中如是使用此文件&#xff01; 实例场景 首先们思考这样一个问题&#xff1a;如果我们在编写测试用…

AIMS医院手术麻醉信息系统全套源码,自主版权,开箱即用

手术麻醉临床信息系统有着完善的临床业务功能&#xff0c;能够涵盖整个围术期的工作&#xff0c;能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施&#xff0c;能够规范麻醉科的工作流程&#xff0c;实现麻醉手术过程的信息数字化&#xff0c;自动生成麻…

如何无损压缩视频?这些技巧你一定用得到

在日常生活中&#xff0c;我们常常会遇到视频文件过大、手机或电脑存储空间不足的情况。这时候&#xff0c;我们就需要将这些视频文件的内存进行压缩&#xff0c;以节省空间。但是&#xff0c;一个一个地压缩视频文件显然是不现实的。那么&#xff0c;如何快速批量压缩视频呢&a…

【马蹄集】—— 数论专题:筛法

数论专题 目录 MT2213 质数率MT2214 元素共鸣MT2215 小码哥的喜欢数MT2216 数的自我MT2217 数字游戏 MT2213 质数率 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;256M 题目描述 请求出 [ 1 , n ] \left[1,n\right] [1,n] 范围内质数占比率。…

【word技巧】如何限制word页眉,不被他人修改

我们设置了页眉内容之后&#xff0c;不想其他人修改自己的页眉内容&#xff0c;我们可以设置加密的&#xff0c;设置方法如下&#xff1a; 先将页眉设置好&#xff0c;退出页眉设置之后&#xff0c;我们选择布局功能&#xff0c;点击分隔符 – 连续 设置完之后页面分为上下两节…