gpt4 book ai didi

JavaFx 的 Javascript 函数监听器功能

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:44:10 27 4
gpt4 key购买 nike

我的公司正在寻求将我们的嵌入式浏览器切换到 JavaFx。但是,我们当前的浏览器目前具有监听 javascript 函数并在调用时回调 java 的功能。它看起来像这样:

embeddedBrowser.registerFunction("ajavascriptFunction", new BrowserFunction() {

public JSValue invoke(JSValue... args) {
//Do callback work
}
});

这不需要修改 html 端(一个要求),实际上只需要了解 javascript 函数名称(我可能能够研究更多信息,但这是高度推荐的)。

有没有办法以同样的方式使用 JavaFx

最佳答案

我认为这可以满足您的需求。我从this question那里借用了一个想法弄清楚javascript:

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

public class JavaScriptFunctionListener extends Application {

@Override
public void start(Stage primaryStage) {
WebView webView = new WebView();
WebEngine engine = webView.getEngine();

engine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
if (newState == Worker.State.SUCCEEDED) {
addFunctionHandlerToDocument(engine);
}
});

// Just a demo: in real life can load external HTML resource:
engine.loadContent(
"<html><head><script>"
+ "var count = 0 ;"
+ "function someFunction(x) {"
+ " count ++ ;"
+ " document.getElementById(x).innerHTML = 'Count: '+count ;"
+ "}"
+ "</script></head>"
+ "<body>"
+ " <input type=\"button\" value=\"Click Me\" onclick=\"someFunction('display');\"/>"
+ " <div id='display'></div>"
+ "</body>"
+ "</html>"
);

Button registerButton = new Button("Register handler for 'someFunction'");
registerButton.setOnAction(event -> {
registerFunction("someFunction", engine);
// registering the same function twice will break everything
// so don't allow this to happen again:
registerButton.setDisable(true);
});

HBox controls = new HBox(5, registerButton);
controls.setPadding(new Insets(10));
controls.setAlignment(Pos.CENTER);

BorderPane root = new BorderPane(webView, null, null, controls, null);
Scene scene = new Scene(root, 600, 400);
primaryStage.setScene(scene);
primaryStage.show();

}

private void registerFunction(String functionName, WebEngine engine) {
engine.executeScript(
"var fun = " + functionName + " ;"
+ functionName + " = function() {"
+ " app.functionCalled('" + functionName + "');"
+ " fun.apply(this, arguments)"
+ "}"
);
}

private void addFunctionHandlerToDocument(WebEngine engine) {
JSObject window = (JSObject) engine.executeScript("window");
window.setMember("app", this);
}

public void functionCalled(String name) {
System.out.println(name + " was called");
}

public static void main(String[] args) {
launch(args);
}
}

关于JavaFx 的 Javascript 函数监听器功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29172001/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com