2016-02-11 54 views
1

我认为JxBrowser 6.1中的JavaScript Java Bridge API存在问题。我尝试了一个非常简单的代码来调用Javascript中的java类的方法。这里是代码。在java中,java被设置为javascript window对象的属性,该对象为Events类的实例,然后加载html。在html中,我只需要拨打Events类的Close方法即可。但是,当我点击Close按钮,JAVA Close功能不会被调用,并从JxBrowser控制台有一条消息说:JxBrowser 6.1 JavaScript Java Bridge API不起作用

遗漏的类型错误:无法读取属性未定义

“关闭”,这意味着即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"); 

    } 

} 

simple.html:

<!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> 

这里是我用来做这个的文章: https://jxbrowser.support.teamdev.com/support/solutions/articles/9000013062-calling-java-from-javascript

请更正我如果我错了。 在此先感谢。

回答

2

请确保在访问其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"); 
+0

谢谢,我这样做了,它解决了这个问题一些如何,但有另一种错误说:'未捕获IllegalAccessException:类com.teamdev.jxbrowser.chromium.JSContext不能访问类RezRem成员使用修饰符“public”“'的事件。为了这个错误,我在'public'修饰符的另一个文件中声明了'Events'类,现在没有问题。 –

+1

JavaScript只能访问公共类和方法。 //jxbrowser.support.teamdev.com/solution/articles/9000013062-calling-java-from-javascript – Vladimir

+0

最近添加注释,谢谢;) –