<AI>
WebView内のJavaScriptからJava側へ「行番号」「列番号」「ファイル名」を渡すには、
JavaFXの WebEngine.getJavaScriptEnabled() を有効にした上で、
JSObject を利用してJavaScriptのグローバルスコープにJavaオブジェクトをバインドします。
実装手順
1. Java側(呼び出されるメソッドの定義)
受け取ったデータ(行、列、ファイル名)を処理するクラスを定義します。
java
public class Bridge {
// JavaScriptから呼び出されるメソッド
public void openFilePosition(int line, int column, String fileName) {
System.out.println("ファイル名: " + fileName);
System.out.println("行番号: " + line);
System.out.println("列番号: " + column);
// ここにJava側の処理(エディタで該当箇所を開くなど)を記述
}
}
2. Java側(JavaScriptとの連携設定)
WebView の初期化時に、定義したクラスのインスタンスをJavaScriptの window オブジェクトのプロパティとして公開します。
java
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import netscape.javascript.JSObject;
// WebViewとWebEngineの初期化
WebView webView = new WebView();
WebEngine webEngine = webView.getEngine();
// Javaオブジェクトを生成
Bridge bridge = new Bridge();
// ページ読み込み完了後にバインドする
webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
JSObject window = (JSObject) webEngine.executeScript("window");
// JavaScriptから window.javaBridge としてアクセスできるようにする
window.setMember("javaBridge", bridge);
});
webEngine.load("ファイルのURLやHTMLパス");
3. JavaScript側(呼び出し元の処理)
JavaFX側でバインドされた javaBridge を通じてメソッドを呼び出します。
javascript
function sendLocationToFx() {
var fileName = "main.js";
var line = 42;
var column = 15;
// Java側のメソッドを呼び出す
if (window.javaBridge) {
window.javaBridge.openFilePosition(line, column, fileName);
}
}
注意点Javaの公開メソッドは public である必要があります。
JSObject や getJavaScriptEnabled() などのクラスを利用するため、
プロジェクトのビルドパス・モジュール設定で javafx.web モジュールが含まれていることを確認してください。