<AI>
WebView内のカーソル位置(行・列)を取得するには、
Java側からJavaScriptを実行してカーソル位置の文字オフセット(文字数)を取得し、文字列を改行で分割して計算します。
実装手順
executeScript でオフセットを取得する
getSelection() から現在位置のインデックスを取得します。
改行位置から行と列を計算する
取得したオフセットまでの文字列を \n で分割することで、行数と列数を算出します。
サンプルコード(Java)
java
// WebViewのWebEngineを取得
WebEngine engine = webView.getEngine();
// JSを実行してカーソル位置(開始位置)の文字オフセットを取得
Object result = engine.executeScript(
"var selection = window.getSelection();" +
"if (selection.rangeCount > 0) {" +
" var range = selection.getRangeAt(0);" +
" var preRange = range.cloneRange();" +
" preRange.selectNodeContents(document.body);" +
" preRange.setEnd(range.endContainer, range.endOffset);" +
" preRange.toString().length;" +
"} else { 0; }"
);
int cursorOffset = ((Number) result).intValue();
// エディタ(または body)の全テキストを取得
String fullText = (String) engine.executeScript("document.body.innerText;");
// オフセット位置までのテキストを抽出
String textBeforeCursor = fullText.substring(0, cursorOffset);
// 改行で分割して行と列を計算
String[] lines = textBeforeCursor.split("\\n", -1);
int row = lines.length; // 行番号(1始まり)
int col = lines[lines.length - 1].length() + 1; // 列番号(1始まり)
System.out.println("行: " + row + ", 列: " + col);
※ 上記コードは contenteditable 属性が付与されたタグ内や、
通常のHTML入力欄でのテキスト選択状態に対応する汎用的なアプローチです。
対象が特定の