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

这篇具有很好参考价值的文章主要介绍了JCEF中js与java交互、js与java相互调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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>

效果
JCEF中js与java交互、js与java相互调用,java,java,jcef,chrome文章来源地址https://www.toymoban.com/news/detail-736510.html

到了这里,关于JCEF中js与java交互、js与java相互调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Chrome】使用k8s、docker部署无头浏览器Headless,Java调用示例

    无头浏览器是一种没有图形用户界面的浏览器。无头浏览器不通过其图形用户界面( GUI )控制浏览器的操作,而是使用命令行。 Chrome Headless 用于抓取(谷歌)、测试(开发者)和黑客(黑客)。 搜索引擎,使用它来呈现页面、生成动态内容和索引来自单页 Web 应用程序的数据。 SEO 工

    2024年02月08日
    浏览(45)
  • js和java交互websocket实现实时聊天

    目录 1.运用场景(实现效果):  2.代码及其讲解: js配置: (1)时间判断函数: (2)建立ws连接: 结束!         前端运用原生js来与后端提供的ws进行交互,实现在线实时聊天,离线储存数据方便读取聊天记录的效果,效果图如下: (1)时间判断函数: (2)建立ws连接:

    2024年02月12日
    浏览(37)
  • Java服务器调用Python服务器进行交互:基于Http协议的Restful风格调用(Springboot/FastApi)

    实现Java服务器调用Python服务器进行交互以及数据传输,可采用以下方法,亲测有效: 基于Restful风格进行请求调用: 框架 : Java服务器采用Springboot框架进行搭建服务 python服务器采用FastApi框架进行搭建服务 思路 :前端–Java–python–Java–前端 代码设计 :Axios-@PostMapping-请求

    2024年04月26日
    浏览(44)
  • Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库

    1.首先认识一下NDK。 (1)什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,

    2024年02月11日
    浏览(49)
  • OC与Swift的相互调用

    1、在 Build Settings 搜索 Packaging ,设置 Defines Module 为 YES  2、新建 LottieBridge.swift 文件,自动生成桥 ProductName-Bridging-Header.h  3、在 LottieBridge.swift 中,定义Swift类继承于OC类,声明 @objcMembers 或 @objc ,实现相关方法 4、在OC代码中引用 ProductName-Swift.h ,调用Swift相关方法 1、在 Pr

    2024年02月14日
    浏览(44)
  • SpringMVC 怎么和 AJAX 相互调用的

    通过 Jackson 框架就可以把 Java 里面的对象直接转化成 Js 可以识别的 Json 对象。 步骤如下 : a、加入 Jackson.jar b、在配置文件中配置 json 的映射 c、在接受 Ajax 方法里面可以直接返回 Object,List 等,但方法前面要加上@ResponseBody 详细步骤: 在 SpringMVC 中配置一个控制器来处理 AJAX

    2024年02月15日
    浏览(40)
  • 【C与C++的相互调用方法】

      C 和 C++ 之间的相互调用方式存在区别,主要是由于 C 和 C++ 语言本身的设计和特性不同。 函数调用和参数传递方式不同 :C 和 C++ 在函数调用和参数传递方面有一些不同之处。C 使用标准的函数调用约定,而 C++ 在函数调用中可能包含额外的信息,如函数重载和默认参数。

    2024年02月12日
    浏览(35)
  • Vue3父子组件相互调用方法

    下面演示均为使用 setup 语法糖的情况! 参考网址:https://cn.vuejs.org/api/sfc-script-setup.html#defineexpose 子组件需要使用defineExpose对外暴露方法,父组件才可以调用! 1.子组件 2.父组件 3.测试结果 1.父组件 2.子组件 3.测试结果 今天的分享就到这里啦~~ 如有错误,欢迎随时雅正。

    2024年02月11日
    浏览(54)
  • 使用Selenium与Chrome DevTools交互

    目录 为什么我们应该自动化Chrome开发工具? 如何打开Chrome DevTools 元素 控制台 源代码

    2024年02月15日
    浏览(53)
  • node.js通过node-java库调用java接口(jar包)

    最近因项目需求,需要调用第三方java的打的jar包,但项目后端是用node.js写的,因此需要用node.js调用第三方jar,网上搜集资料,发现有一个库,node-java,可以通过js的方式调用java语言的包,以及包中的方法,因此整理了一下,以防时间长忘记,具体如下: jdk 1.8 并配置java_home、

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包