<AI>
JavaFXのWebView単体では行・列の文字位置を取得するAPIは持っていません。
そのため、WebEngineを使用してJavaScriptを埋め込み、
WebページのDOMから選択範囲やカーソル(キャレット)の位置を取得するのが一般的です。
手順:JavaScriptの実行結果をJavaで受け取る
以下の手順でJavaScriptの Selection や Range オブジェクトを活用し、カーソル位置を特定します。
1. カーソル位置を計算するJavaScriptの定義
input や textarea 要素、または contenteditable 要素内のカーソル位置(文字数ベース)を算出するJS処理を記述します。
2. Java側から executeScript で実行
webView.getEngine().executeScript() を呼び出し、JavaScriptの結果を取得します。
実装例(文字のインデックス位置を取得)
テキスト入力エリア内での「先頭からの文字数(オフセット)」を取得するJavaコードの例です。
java
// ... (前略)
// クリック時に contenteditable 内の文字オフセットを取得する例
String jsCode =
"(function() {" +
" var sel = window.getSelection();" +
" if (sel.rangeCount > 0) {" +
" var range = sel.getRangeAt(0);" +
" var preCaretRange = range.cloneRange();" +
" preCaretRange.selectNodeContents(document.getElementById('editor'));" +
" preCaretRange.setEnd(range.endContainer, range.endOffset);" +
" return preCaretRange.toString().length;" +
" }" +
" return 0;" +
"})();";
// executeScript で実行し、結果を数値として受け取る
Object result = webEngine.executeScript(jsCode);
System.out.println("Caret Offset: " + result);
// ...
「行・列」の文字位置として取得する際の注意点
厳密な「行」と「列」をWeb上のテキストから特定するには、以下の要素を自前で計算する必要があります。
折り返し処理の考慮
ブラウザ側の画面幅による「自動折り返し」がある場合、ソースコードとしての改行(\n)と、画面上の行は一致しません。
計算方法のステップ
上記のJavaScriptの例のように、まずキャレットの全体オフセットを取得します。
その文字列を改行コード (\n) ごとに分割します。
何行目の文字列か、およびその行のどこにオフセットがあるかを照合し、行番号・列番号を算出します。
また、Web関連の技術情報を探す際には、MDN Web Docs - Selection API のドキュメントがJavaScript処理を実装する上で非常に参考になります