Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JxBrowser 6.1 JavaScript Java桥API不工作_Java_Api_Bridge_Jxbrowser - Fatal编程技术网

JxBrowser 6.1 JavaScript Java桥API不工作

JxBrowser 6.1 JavaScript Java桥API不工作,java,api,bridge,jxbrowser,Java,Api,Bridge,Jxbrowser,我认为JxBrowser 6.1中的JavaScriptJavaBridgeAPI存在问题。我尝试了一个非常简单的代码来调用Javascript中java类的方法。这是密码。在java中,java被设置为javascriptwindow对象上的一个属性,作为Events类的一个实例,然后加载html。在html中,我只需调用Events类的Close方法。但是,当我单击Close按钮时,javaClose函数没有被调用,控制台中有一条来自JxBrowser的消息: 未捕获类型错误:无法读取未定义

我认为JxBrowser 6.1中的JavaScriptJavaBridgeAPI存在问题。我尝试了一个非常简单的代码来调用Javascript中java类的方法。这是密码。在java中,
java
被设置为javascript
window
对象上的一个属性,作为
Events
类的一个实例,然后加载html。在html中,我只需调用
Events
类的
Close
方法。但是,当我单击
Close
按钮时,java
Close
函数没有被调用,控制台中有一条来自JxBrowser的消息:

未捕获类型错误:无法读取未定义的属性“Close”

这意味着未定义
window
对象的
java
属性

Main.java:

public class Main extends Application {

    private Browser browser;

    public static void main(String[] args) {

        launch(args);

    }

    @Override
    public void start(Stage primaryStage) {

        Platform.setImplicitExit(false);

        browser = new Browser();

        JSValue window = browser.executeJavaScriptAndReturnValue("window");

        window.asObject().setProperty("java", new Events());

        BrowserView browserView = new BrowserView(browser);

        StackPane pane = new StackPane();

        pane.getChildren().add(browserView);

        Scene scene = new Scene(pane, 330, 470);

        primaryStage.initStyle(StageStyle.UNDECORATED);

        primaryStage.setScene(scene);

        primaryStage.show();

        browser.loadURL(Main.class.getResource("templates/simple.html").toExternalForm());

    }

}

class Events {

    public void Close() {

        System.out.println("close button clicked");

    }

}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
    <button id="Close">Close</button>
    <script>
        document.getElementById('Close').onclick = function () {
            window.java.Close();
        }
    </script>

</body>
</html>
simple.html:

public class Main extends Application {

    private Browser browser;

    public static void main(String[] args) {

        launch(args);

    }

    @Override
    public void start(Stage primaryStage) {

        Platform.setImplicitExit(false);

        browser = new Browser();

        JSValue window = browser.executeJavaScriptAndReturnValue("window");

        window.asObject().setProperty("java", new Events());

        BrowserView browserView = new BrowserView(browser);

        StackPane pane = new StackPane();

        pane.getChildren().add(browserView);

        Scene scene = new Scene(pane, 330, 470);

        primaryStage.initStyle(StageStyle.UNDECORATED);

        primaryStage.setScene(scene);

        primaryStage.show();

        browser.loadURL(Main.class.getResource("templates/simple.html").toExternalForm());

    }

}

class Events {

    public void Close() {

        System.out.println("close button clicked");

    }

}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
    <button id="Close">Close</button>
    <script>
        document.getElementById('Close').onclick = function () {
            window.java.Close();
        }
    </script>

</body>
</html>

接近
document.getElementById('Close').onclick=function(){
Close();
}
下面是我用来做这件事的文章:

如果我错了,请纠正我。
提前感谢。

请确保在访问其JavaScript和注册Java对象之前加载所需的网页。例如:

browser.addLoadListener(new LoadAdapter() {
    @Override
    public void onFinishLoadingFrame(FinishLoadingEvent event) {
        if (event.isMainFrame()) {
            Browser browser = event.getBrowser();
            JSValue value = browser.executeJavaScriptAndReturnValue("window");
            value.asObject().setProperty("Account", new Account());
        }
    }
});

browser.loadURL("form.html");

谢谢,我这样做了,它以某种方式解决了问题,但出现了另一个错误:“Uncaught IllegalAccessException:Class com.teamdev.jxbrowser.chromium.JSContext无法访问带有修饰符“public”的类RezRem.Events的成员”“。对于这个错误,我用
public
修饰符在另一个文件中声明了
Events
类,现在没有问题了。JavaScript只能访问公共类和方法。请检查最近添加的注释,谢谢;)