JCEF-JSとJAVAコードの相互作用(4)

JSとJAVAコード間の相互作用を実現することは、アプリケーションに必要なステップです。JSを介してJAVAコードを呼び出し、JAVAコードで実現できるすべてのことを実現します。org.cef.browser.CefMessageRouterクラスのドキュメントを参照してください。

非同期であるため、Javaコードの処理結果を取得するには、処理結果をコールバックする必要があります。現在の通話形式は好きではありません。JAVAコードを操作する手順が多い場合、JSコードはレイヤーごとにレイヤー化されますが、これは非常に見苦しいことです。

JAVAコードの実装

public class JsTestFrame extends JFrame{
     
    /**
     *
     */
    private static final long serialVersionUID = -9131822589633996915L;
 
    public static void main(String[] args) {
        String url=System.getProperty("user.dir")+"/jstest.html";
        new JsTestFrame(url);
    }
     
    public JsTestFrame(String url) {
        //是否Linux系统
        boolean useOSR=OS.isLinux();
        //是否透明
        boolean isTransparent=false;
        //添加Handler,在CEFAPP状态为终止时退出程序
        CefApp.addAppHandler(new CefAppHandlerAdapter(null) {
            @Override
            public void stateHasChanged(org.cef.CefApp.CefAppState state) {
                // Shutdown the app if the native CEF part is terminated
                if (state == CefAppState.TERMINATED) System.exit(0);
            }
        });
         
        CefSettings settings = new CefSettings();
        settings.windowless_rendering_enabled = useOSR;
        //获取CefApp实例
        CefApp cefApp=CefApp.getInstance(settings);
        //创建客户端实例
        CefClient cefClient = cefApp.createClient();
         
        //添加一个JS交互
        jsActive(cefClient);
         
        //创建浏览器实例
        CefBrowser cefBrowser = cefClient.createBrowser(url, useOSR, isTransparent);
         
        //将浏览器UI添加到窗口中
         
        getContentPane().add(cefBrowser.getUIComponent(), BorderLayout.CENTER);
         
        pack();
        setTitle("测试JCEF-JS与JAVA代码交互");
        setSize(800, 600);
        setVisible(true);
        //添加一个窗口关闭监听事件
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                CefApp.getInstance().dispose();
                dispose();
            }
        });
    }
     
    /**
     * 添加js交互
     * @author:liuming
     */
    public void jsActive(CefClient client) {
         //配置一个查询路由,html页面可使用 window.java({}) 和 window.javaCancel({}) 来调用此方法
         CefMessageRouterConfig cmrc=new CefMessageRouterConfig("java","javaCancel");
         //创建查询路由
         CefMessageRouter cmr=CefMessageRouter.create(cmrc);
         cmr.addHandler(new CefMessageRouterHandler() {
             
            @Override
            public void setNativeRef(String str, long val) {
                System.out.println(str+"  "+val);
            }
             
            @Override
            public long getNativeRef(String str) {
                System.out.println(str);
                return 0;
            }
             
            @Override
            public void onQueryCanceled(CefBrowser browser, CefFrame frame, long query_id) {
                System.out.println("取消查询:"+query_id);
            }
             
            @Override
            public boolean onQuery(CefBrowser browser, CefFrame frame, long query_id, String request, boolean persistent,
                    CefQueryCallback callback) {
                System.out.println("request:"+request+"\nquery_id:"+query_id+"\npersistent:"+persistent);
                 
                callback.success("Java后台处理了数据");
                return true;
            }
        }, true);
        client.addMessageRouter(cmr);
    }
}

htmlの実装では、プロジェクトのルートディレクトリに新しいjstest.htmlを作成します

<!DOCTYPE html>
<html>
<head>
<title>JCEF帮助文档</title>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<a href="javascript:testToJava()">测试与java代码交互</a>
</body>
<script>
function testToJava(){
window.java({
    request: '发送给JAVA的数据',
    persistent:false,
    onSuccess: function(response) {
      alert("返回的数据:"+response);
    },
    onFailure: function(error_code, error_message) {}
});
}
</script>
<!-- author:玄翼猫 -->
</html>

JCEFの公式デモを参照してください

PowerOfLongedJcefのリフレクション+注釈を介して実装を参照することもできます

このサンプルチュートリアルのオープンソースプロジェクトアドレス:
githubhttps//github.com/lieyanfeimao/JcefTest.git
Code Cloudhttps//gitee.com/edadmin/JcefTest.git

オープンソースプロジェクト:

PowerOfLongedJcef [注:このプロジェクトはwin10 64ビットシステムで開発されており、他のシステムを直接実行できることを保証するものではありません]

githubhttps//github.com/lieyanfeimao/PowerOfLongedJcef.git
码✓https//gitee.com/edadmin/PowerOfLongedJcef.git

おすすめ

転載: blog.csdn.net/xymmwap/article/details/101198634