Я создаю плагин для 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>