Почему я не могу вызвать метод java через HTML / JS в плагине IntelliJ ToolWindow? - PullRequest
1 голос
/ 27 мая 2020

Я создаю плагин для IntelliJ IDEA, который должен загружать локальный c веб-контент (HTML, CSS, JS) в ToolWindow и вызывать метод java из этого HTML / JS содержание. Я использовал JavaFX WebView для загрузки содержимого HTML в ToolWindow. Но когда я попытался вызвать методы Java из HTML или JS, это не сработало, а иногда выдает фатальную ошибку и приводит к сбою приложения.

Пожалуйста, дайте мне знать, есть ли какие-либо другой способ интегрировать stati c веб-контент в ToolWindow. Ниже приведены примеры кодов.

public class MyToolWindow implements ToolWindowFactory {

private JFXPanel jfxPanel;

@Override
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
    toolWindow = ToolWindowManager.getInstance(project)
            .getToolWindow(Messages.getMessagePropertyText(Messages.PLUGIN_TITLE));

    JPanel myPanel = new JPanel(new BorderLayout());
    jfxPanel = new JFXPanel();
    createScene();
    myPanel.add(jfxPanel);

    Content findingPanel = toolWindow.getContentManager().getFactory().createContent(myPanel,"",false);
    toolWindow.getContentManager().addContent(findingPanel);
}
public void invokedFromJS() {
    System.out.println("Invoked from JS");
}

private void createScene() {
    Platform.setImplicitExit(false);
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            BorderPane borderPane = new BorderPane();
            WebView webComponent = new WebView();
            WebEngine webEngine = webComponent.getEngine();

            webEngine.documentProperty().addListener((obs, oldDoc, newDoc) -> {
                JSObject window = (JSObject) webEngine.executeScript("window");
                window.setMember("app", new TestClass());
            });

            webEngine.load(MyToolWindow.class.getResource("/mypage.html").toString());

            borderPane.setCenter(webComponent);
            Scene scene = new Scene(borderPane,450,600);
            jfxPanel.setScene(scene);

        }
    });
}}

mypage. html

 <html>
 <head>
    <meta charset="ISO-8859-1">
    <title>Insert title here</title>
    <script type="text/javascript">
       function m() {
          try {
             window.app.onClick();
          }catch(err) {
             console.log(err);
          }
       }
    </script>
 </head>
 <body>

 <button onclick="m()">Click ME</button>
 </body>
 </html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...