簡體   English   中英

JAVA FX + Javascript

[英]JAVA FX + Javascript

我從未使用過JavaFX,但是現在我需要編寫一個將嵌入瀏覽器的小型應用程序,並且需要將一些數據傳遞給瀏覽器並從瀏覽器取回一些數據。 正如我讀過的,我需要JavaScript作為交換數據的橋梁。 我嘗試了很多這樣的示例:

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

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

但我什么都做不了。

有人可以給我工作的例子嗎?

我認為您正在詢問JavaFX和JavaScript之間的交互

首先,此操作通過Nashorn Engine執行

讓我們了解一個簡單的示例並編寫其完整代碼:

問題:我們想使用javafx,JS和html獲取兩個數字的和

假設我們有HTML

  1. 兩個輸入字段以從用戶獲取值
  2. 計算字段中數字之和的按鈕
  3. 在div中,我們預覽數字的總和

當用戶單擊按鈕時,它調用JavaScript函數,該函數調用java方法(即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()),並為其指定了要在Java腳本代碼中使用的名稱(adder),所以現在的問題是如何在JavaScript中使用加法器?

考慮以下JavaScript函數並調用它添加

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

如我們所見,很簡單,我們只調用傳遞的(注入的)java對象(Adder對象),但是使用名稱adder並調用方法getSum(“ 5”,“ 7”)

現在我們有一個完整的代碼

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> 

最后,這是Java和JavaScript交互的簡單開始,我希望本文對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM