<AI>
JavaFX の TextArea に標準で備わるカーソル位置の行番号取得メソッドはないため、
正規表現などを用いて文字列から算出し、その行情報を元にジャンプ処理を実装します。
以下の手順で、現在カーソルがある行のテキストを解析し、目的のエディターへジャンプする処理を実現できます。
1. 現在行のテキストを取得する
現在のカーソル位置から、直前と直後の改行(\n)のインデックスを検索して抽出します。
java
// TextArea から現在のカーソル位置を取得
int caretPos = textArea.getCaretPosition();
String text = textArea.getText();
// 直前の改行位置(見つからない場合は -1)
int prevNewline = text.lastIndexOf('\n', caretPos);
// 次の改行位置(見つからない場合はテキストの末尾)
int nextNewline = text.indexOf('\n', caretPos);
if (nextNewline == -1) {
nextNewline = text.length();
}
// 現在行のテキストを切り出し
String currentLineText = text.substring(prevNewline + 1, nextNewline);
2. 切り出したテキストから行番号を抽出
正規表現を用いて、行データに記述されている行番号(例: "line 15" のような文字列)をパースします。
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// 例として "Line: 12" や "行 12" など数値を取り出す正規表現
Pattern pattern = Pattern.compile(".*?(\\d+).*?");
Matcher matcher = pattern.matcher(currentLineText);
int targetLineNumber = -1;
if (matcher.find()) {
// 抽出した数値をジャンプ先の行番号(0始まりに調整する場合は -1)とする
targetLineNumber = Integer.parseInt(matcher.group(1));
}
3. エディター画面で該当行へジャンプする
抽出した行番号を基に、対象となるエディターコンポーネント(ここでは仮に別の TextArea または独自のエディター画面とします)
のカーソルを移動させます。
java
if (targetLineNumber >= 1) {
// 目的のエディタの該当行の先頭インデックスを算出(単純な文字数カウントの例)
String editorText = editorTextArea.getText();
String[] lines = editorText.split("\n");
if (targetLineNumber <= lines.length) {
int jumpOffset = 0;
for (int i = 0; i < targetLineNumber - 1; i++) {
jumpOffset += lines[i].length() + 1; // 1は改行文字分
}
// エディタのカーソルを移動
editorTextArea.positionCaret(jumpOffset);
// エディタ画面をその位置までスクロール
editorTextArea.selectRange(jumpOffset, jumpOffset);
}
}
補足:さらに高度なエディターを作成する場合
もし上記の TextArea の機能だけでは実装が複雑になる場合や、
より高度なシンタックスハイライト・行番号表示機能が必要な場合は、
外部ライブラリの RichTextFX を利用するのが一般的です。
このライブラリにはパラグラフ(行)インデックスを直接取得する API が備わっています。