【问题标题】:JAVA FX + JavascriptJAVA 外汇 + Javascript
【发布时间】:2017-01-14 20:20:05
【问题描述】:

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

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

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

但我什么都做不了。

有人可以给我一个工作示例吗?

【问题讨论】:

  • “我什么都做不了”。尝试一个非常简单的示例,并在此处发布完整的示例,解释您认为它应该做什么以及它的不同之处。仅仅说某事不起作用并不足以描述任何人都可以提供帮助的问题。
  • 如果您正在寻找 JavaScript (TypeScript) 中 JavaFX 的实现,请查看 Script4J

标签: javascript java javafx


【解决方案1】:

我想你是在问 javaFX 和 JavaScript 之间的交互

最初这个操作是通过Nashorn引擎进行的

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

一个问题:我们想用 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() )并给它一个名字(adder),以便在 java 脚本代码中使用,所以现在的问题是如何在 JavaScript 中使用 adder?

考虑以下 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 包中

<!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之间交互的一个简单开始,希望这篇文章对你有帮助和有用

【讨论】:

  • 谢谢,很棒的例子。还有一个问题 - 我应该如何从 AngularJS 定义 adder.getSum(num1, num2) 函数?它说加法器未定义。
  • 对不起兄弟,我从来不和AngularJS打交道,
  • 我建议您在处理 java 时混合使用普通的 js 代码,但我使用 javafx 和 JQuery 并且它们运行良好
  • 我改变了 document.getElementById("outputDiv").innerHTML = "sum = " + sum;到 - 警报(总和);它不工作
  • 在我将扩展名从 xhtml 更改为 html 后,这对我有用。否则它只会渲染内部文本。
猜你喜欢
  • 2016-06-02
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
相关资源
最近更新 更多