<AI>
JavaFXのWebView内で文字のカーソル位置(または文字座標)を取得するには、
JavaからJavaScriptを実行するexecuteScriptメソッドを利用します。
文字の相対インデックス(何文字目か)を取得する
選択状態やフォーカスがある要素の情報を、
JavaScriptの getSelection() や selectionStart で取得してJava側に戻り値として受け取ります。
java
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(selection.anchorNode);" +
" preRange.setEnd(range.startContainer, range.startOffset);" +
" preRange.toString().length;" + // ここで先頭からの文字数を計算
"} else { -1; }"
);
int caretPosition = ((Number) result).intValue();
System.out.println("現在の文字位置: " + caretPosition);
画面上のピクセル座標(X,Y)を取得する
画面上におけるカーソルの物理的なピクセル座標が必要な場合は、getBoundingClientRect() を使用します。
java
// 画面上のカーソル位置(X, Y)を取得する
Object xResult = engine.executeScript("window.getSelection().getRangeAt(0).getBoundingClientRect().left");
Object yResult = engine.executeScript("window.getSelection().getRangeAt(0).getBoundingClientRect().top");
double x = ((Number) xResult).doubleValue();
double y = ((Number) yResult).doubleValue();
System.out.println("カーソルの座標: X=" + x + ", Y=" + y);
注意点
この方法は、ページ内の input 要素や textarea 要素内、
あるいは contenteditable 属性が付与された編集可能領域(リッチテキストエディタ等)に対してのみ有効です。
Worker.State が SUCCEEDED になり、ページの読み込みが完全に完了した後にJavaScriptを実行してください。
詳細は OracleのJavaFXドキュメント の executeScript の項をご参照ください