JavaFx中WebView插件加载的HTML中JavaScript和Java通信

在编写JavaFx工作流的过程中,由于工作流用的是jquery实现,其中有一些数据,需要通过JavaScript传递到后台Java对象,并保存。 大概原则是:首先在Java中创建一个对象,把该对象设置到网页去。而对于另一个方向,JavaScript创建一个对象并从网页中提取出来。下面用代码演示。首先是Java的代码

package sample;

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

import java.io.File;
import java.net.URL;

@SuppressWarnings("restriction")
public class Main extends Application {

    /** 用于与Javascript引擎通信。 */
    private JSObject javascriptConnector;

    /** 用于从Javascript引擎进行通信。 */
    private JavaConnector javaConnector = new JavaConnector();;

    @Override
    public void start(Stage primaryStage) throws Exception {
        URL url = new File("H:\\WorkSpace_Browse\\WorkBrowerV1.2\\src\\main\\java\\sample\\test.html").toURI().toURL();

        WebView webView = new WebView();
        final WebEngine webEngine = webView.getEngine();

        // 设置Java的监听器
        webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
            if (Worker.State.SUCCEEDED == newValue) {
                // 在web引擎页面中设置一个名为“javaConnector”的接口对象
                JSObject window = (JSObject) webEngine.executeScript("window");
                window.setMember("javaConnector", javaConnector);

                // 获取Javascript连接器对象。
                javascriptConnector = (JSObject) webEngine.executeScript("getJsConnector()");
            }
        });

        Scene scene = new Scene(webView, 300, 150);
        primaryStage.setScene(scene);
        primaryStage.show();

        // 这里加载页面
        webEngine.load(url.toString());
    }

    public static void main(String[] args) {
        launch(args);
    }

    public class JavaConnector {
        /**
         * 让JavaScript调用的方法
         *
         * @param value 网页传过来的值
         */
        public void toLowerCase(String value) {
            System.out.println(value);
            if (null != value) {
                // 这里收到了JavaScript传来的数据,再传送一个值回去给JavaScript
                javascriptConnector.call("showResult", value.toLowerCase());
            }
        }
    }
}

首先,加载网页后,将javaConnector对象设置到HTML页面中,使Javascript能够直接调用;

JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("javaConnector", javaConnector);

随后,在网页检索javascriptConnector对象,使用回调JavaScript,同时传值到JavaScript;

javascriptConnector = (JSObject) webEngine.executeScript("getJsConnector()");

调用javaConnector的toLowerCase(String value) 方法,将值传入到Java,然后通过javascriptConnector对象发回,其实还有更方便的方法返回给JavaScript,这里就不写了。下面给出网页的代码:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Sample</title>
    </head>
    <body>
        <main>

            <div><input id="input" type="text"></div>
            <button onclick="sendToJava();">to lower case</button>
            <div id="result"></div>

        </main>

        
            function sendToJava () {
                var s = document.getElementById('input').value;
                javaConnector.toLowerCase(s);
            };

            var jsConnector = {
                showResult: function (result) {
                    document.getElementById('result').innerHTML = result;
                }
            };

            function getJsConnector() {
                return jsConnector;
            };
        
    </body>
</html>

sendToJava函数调用,由上述Java设置的javaConnector的方法:

function sendToJava () {
    var s = document.getElementById('input').value;
    javaConnector.toLowerCase(s);
};

然后是Java调用的函数,jsConnector对象里面的showResult函数:

var jsConnector = {
     showResult: function (result) {
             document.getElementById('result').innerHTML = result;
     }
};

function getJsConnector() {
     return jsConnector;
};

JavaScript和后台java之间调用,以及之间的互相传入可以有多种类型,具体可以去官网查找相应的api或者demo。

JavaFX,可以使用WebView组件加载网页并与JavaScript进行交互。通过Java调用JavaScript可以使用WebEngine的executeScript方法来执行JavaScript代码。例如,使用以下代码可以调用JavaScript的jsMethod方法并传递数据: ```java WebEngine engine = webView.getEngine(); String callJsMethod = "jsMethod(data)"; Object result = engine.executeScript(callJsMethod); ``` 其,`jsMethod`是JavaScript的方法名,`data`是要传递给该方法的数据。 另外,如果需要在JavaScript调用Java的方法,可以使用JavaScript的window对象来调用Java的方法。例如,可以通过以下代码在JavaScript调用Java方法: ```javascript window.apps.callFromJs("ja"); ``` 其,`window.apps`表示Java对象,`callFromJs`是Java的方法名,`"ja"`是传递给该方法的参数。 这样,JavaJavaScript之间就可以进行数据的传递和方法的调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JavaFX学习笔记 —— WebView正确与JavaScript交互的使用方法](https://blog.csdn.net/qq_33638188/article/details/126421159)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [JavaFx Webview 与js(vue)交互](https://blog.csdn.net/weixin_44517645/article/details/128180261)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十点数据

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

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

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

打赏作者

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

抵扣说明:

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

余额充值