Вызвать Java-метод из JavaScript в JavaFX

У меня есть приложение javafx. Первоначально он загружает страницу входа в систему с помощью WebView. Страница входа принимает имя пользователя и перенаправляет на другую страницу. В этой HTML-странице у меня есть функция внутри JavaScript. Я хочу вызвать метод Java во время выполнения сценария. но я получаю сообщение об ошибке

ReferenceError: Can't find variable: OpenDoc[at 17]

Это мой html

html>

    <body onload="login()">
        <div id="jnlpStart_EN">
            <H2>Welcome to Home Page</H2>
        </div>
    </body>

    <script type="text/javascript">
        function login() {
            OpenDoc.passDocId('q56wre');
        }
    </script>

</html>

Это мой код Java

public class WebEngineTest1 extends Application {

    @Override
    public void start(Stage primaryStage) {
        WebConsoleListener.setDefaultListener((webView, message, lineNumber, sourceId) -> {
            System.out.println(message + "[at " + lineNumber + "]");
        });

        WebView webView = new WebView();
        WebEngine engine = webView.getEngine();

        engine.load("http://localhost:8001/app/login");
        engine.locationProperty().addListener((obs, oldLocation, newLocation) -> {
            if (newLocation != null && newLocation.endsWith("/home")) {
                JSObject window = (JSObject) engine.executeScript("window");
                window.setMember("OpenDoc", new OpenDoc());
            }
        });
        Scene scene = new Scene(webView, 300, 150);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

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

    public class OpenDoc {
        public void passDocId(String id) {
            System.out.println(id);
        }
    }
}

2 ответа

Решение

Я нашел ответ. Так как после входа в систему он перенаправляет на URL. Мне пришлось добавить слушателя с documentProperty(). Внутри я добавляю код для вызова метода Java из JavaScript. Поэтому при загрузке страницы я не получаю ReferenceError: Can't find variable: OpenDoc[at 17] сообщение, так как я уже добавил ссылку. вот код

engine.documentProperty().addListener((v, o, n) -> {
            String newLocation = webEngine.getLocation();
            if (newLocation != null && newLocation.endsWith("/home")) { 
                JSObject window = (JSObject) engine.executeScript("window");
                        window.setMember("OpenDoc", new OpenDoc());
            }           
        });

Сначала вы должны включить JavaScript на WebEngine

webEngine.setJavaScriptEnabled(true);

и эта линия сделает свое дело

webengine.executeScript("initOpenDoc(\"ID\")");
Другие вопросы по тегам