当前位置:  开发笔记 > 编程语言 > 正文

JAVA FX + Javascript

如何解决《JAVAFX+Javascript》经验,为你挑选了1个好方法。

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

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

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

但我无法做任何事情.

有人能给我举例吗?



1> Anas..:

我想你是在询问javaFX与JavaScript之间的互动

首先,此操作通过Nashorn Engine 执行

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

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

假设我们有HTML

    两个输入字段,用于从用户获取值

    用于计算字段上数字总和的按钮

    div,我们预览数字的总和

当用户点击按钮时,它调用一个调用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","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包中



    
        TODO supply a title
        
    
    
        
        
        
        
推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有