我想你是在问 javaFX 和 JavaScript 之间的交互
最初这个操作是通过Nashorn引擎进行的
让我们理解一个简单的例子并写出它的完整代码:
一个问题:我们想用 javafx、JS 和 html 得到两个数字的和
假设我们有带有
的 HTML
- 两个输入字段从用户那里获取值
- 计算字段上数字总和的按钮
- 我们在其中预览数字总和的 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之间交互的一个简单开始,希望这篇文章对你有帮助和有用