2016-02-11 7 views
1

Я думаю, что есть проблема с JavaScript Java Bridge API в JxBrowser 6.1. Я пробовал очень простой код для вызова метода класса java в Javascript. Вот коды. В java, java устанавливается как свойство на javascript window объект экземпляру класса Events, а затем загружается html. В html я просто вызываю метод Close класса Events. Но когда я нажимаю Close кнопку, Java Close функция не будет вызвана, и есть сообщение в консоли от JxBrowser говоря:JxBrowser 6.1 JavaScript Java Bridge API не работает

Uncaught TypeError: Не удается прочитать свойство «Закрыть» неопределенной

, что означает что java свойство для window объект не определен.

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

Спасибо, я так и сделал, и решить эту проблему, как некоторые, но была еще одна ошибка, говоря: 'Uncaught IllegalAccessException: Класс com.teamdev.jxbrowser.chromium.JSContext не может получить доступ к члену класса RezRem .Events с модификаторами «public» «'. Для этой ошибки я объявил класс 'Events' в другом файле с модификатором' public', и теперь нет проблем. –

+1

JavaScript может иметь доступ только к общедоступным классам и методам. Пожалуйста, отметьте заметки в https: //jxbrowser.support.teamdev.com/solution/articles/9000013062-calling-java-from-javascript – Vladimir

+0

Заметки добавлены недавно, спасибо;) –

 Смежные вопросы

  • Нет связанных вопросов^_^