JAVA FX + Javascript

时间:2017-01-14 20:20:06

标签: javascript java javafx

我从未使用过JavaFX,但是现在我需要编写一个嵌入浏览器的小应用程序,我需要将一些数据传递给浏览器并从浏览器中获取一些数据。 正如我所读到的,我需要JavaScript作为交换数据的桥梁。 我尝试了很多像这样的例子:

http://knowles.co.za/javafx-and-javascript-calling-java-from-javascript/

http://www.java2s.com/Code/Java/JavaFX/WebEngineLoadListener.htm

但是我无法做任何事情。

有人能给我举例吗?

1 个答案:

答案 0 :(得分:7)

我认为您在询问 javaFX与JavaScript之间的互动

首先,此操作通过 Nashorn 引擎

执行

让我们理解一个简单的例子并编写完整的代码:

问题:我们希望使用javafx,JS和html获得两个数字的总和

假设我们有

的HTML
  1. 两个输入字段,用于从用户那里获取值
  2. 按钮,用于计算字段上数字的总和
  3. div,其中我们预览数字的总和
  4. 当用户点击按钮时,它调用一个调用java方法的JavaScript函数(即:java方法)接收这两个数字并返回总和

    所以让我们创建一个java类,它有一个计算两个数字之和的方法,它很简单

    public class Adder{
    
    public double getSum(String a, String b)
    {
        return Double.parseDouble(b) + Double.parseDouble(a);
    }}
    

    所以我们需要将一个java对象传递(注入)到javascript,这样我们可以用它来调用方法,那么如何将java对象注入JS? 只需使用以下代码

    WebView browser = new WebView();
        browser.getEngine().getLoadWorker()
                .stateProperty()
                .addListener((obs, old, neww) ->
                {
                    if (neww == Worker.State.SUCCEEDED)
                    {
                        JSObject jsobj = (JSObject) browser.getEngine()
                                .executeScript("window");
                        jsobj.setMember("adder", new Adder());
                    }
                });
    

    我们在最后一行注入一个java对象(new Adder()),我们给它一个名字(adder)来在java脚本代码中使用,所以现在的问题是如何在JavaScript中使用加法器?

    考虑以下JavaScript函数并将其命名为add

    function add()
            {
                var sum = adder.getSum("5", "7");
            }
    

    正如我们所看到的,我们只是简单地调用传递的(注入的)java对象(Adder对象)但名称为adder并调用方法getSum(" 5",&#34 ; 7&#34)

    现在让我们有一个完整的代码

    1-在IDE中创建一个新的JavaFX项目并命名主类NashornTest,这里是代码

    import javafx.application.Application;
    import javafx.concurrent.Worker;
    import javafx.scene.Scene;
    import javafx.scene.layout.VBox;
    import javafx.scene.web.WebView;
    import javafx.stage.Stage;
    import netscape.javascript.JSObject;
    public class NashornTest extends Application{
    
    @Override
    
    public void start(Stage stage)
    {
    
        //create an embeded web browser
        WebView browser = new WebView();
    
        browser.getEngine().getLoadWorker()
                .stateProperty()
                .addListener((obs, old, neww) ->
                {
                    if (neww == Worker.State.SUCCEEDED)
                    {
                        // Let JavaScript make calls to adder object,
                        //so we need to inject an [Adder] object into the JS code
                        JSObject bridge = (JSObject) browser.getEngine()
                                .executeScript("window");
                        bridge.setMember("adder", new Adder());
                    }
                });
        //load the html page
        browser.getEngine().load(NashornTest.class.getResource("index.xhtml").toString());
        VBox box = new VBox(browser);
    
        Scene scene = new Scene(box);
        stage.setScene(scene);
        stage.show();
    }
    
    public static void main(String[] args)
    {
        launch(args);
    }}
    

    2 - 创建一个java类并将其命名为Adder,这里是代码

    public class Adder{
    
    public double getSum(String a, String b)
    {
        return Double.parseDouble(b) + Double.parseDouble(a);
    }}
    

    3 - 创建一个XHTML文件并将其命名为index.xhtml,这里是脚本,它必须位于NashornTest.java的同一个java包中

    
    
    <!DOCTYPE html>
    <html>
        <head>
            <title>TODO supply a title</title>
            <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
            <script>
                function add()
                {
                    var num1 = document.getElementById("num1Field").value;
                    var num2 = document.getElementById("num2Field").value;
                    //make calls for injected java object
                    var sum = adder.getSum(num1, num2);
                    document.getElementById("outputDiv").innerHTML = "sum = " + sum;
                }
    
            </script>
        </head>
        <body>
            <input id="num1Field"/>
            <input id="num2Field"/>
            <button onclick="add()">sum</button>
            <div id="outputDiv"></div>
        </body>
    </html>
    &#13;
    &#13;
    &#13;

    最后这是Java和JavaScript之间交互的简单开始,我希望这篇文章有用且有用