<AI>
JavaFXの TextArea では、カーソル(キャレット)位置の文字列を抽出し、
その情報から任意の行番号を計算してジャンプ(移動)させます。
主な手順は、現在の文字列全体を改行文字で配列化して特定行を割り出し、
positionCaret() や selectRange() でカーソルを移動することです。
実装手順とサンプルコード
以下に、対象となる行の情報(例えば "行番号: 15" のような文字列)を取得し、
editorの指定行へジャンプする処理の具体的な実装例を示します。
java
import javafx.fxml.FXML;
import javafx.scene.control.TextArea;
public class EditorController {
@FXML
private TextArea textArea; // 検索元(ログや指定情報が書かれている領域)
@FXML
private TextArea editor; // ジャンプ先のテキストエディタ
@FXML
private void jumpToLine() {
// 1. TextAreaの現在のカーソル位置を取得
int caretPosition = textArea.getCaretPosition();
// 2. カーソル位置までの全テキストを取得し、改行コードで分割
String text = textArea.getText();
String textBeforeCaret = text.substring(0, caretPosition);
String[] lines = text.split("\n");
// 3. カーソルがある行のテキストを割り出す
int currentLineIndex = textBeforeCaret.split("\n").length - 1;
if (currentLineIndex < 0 || currentLineIndex >= lines.length) return;
String lineText = lines[currentLineIndex];
// 4. 行のテキストからジャンプ先情報を抽出 (例: "[Jump: 50]" のような記述を想定)
int targetLineNumber = parseLineNumber(lineText);
// 5. editor側の行数を計算しジャンプ(※0始まりでインデックス計算)
if (targetLineNumber > 0) {
String[] editorLines = editor.getText().split("\n");
int targetIndex = Math.min(targetLineNumber - 1, editorLines.length - 1);
if (targetIndex >= 0) {
// 移動先インデックスまでの文字数を計算してキャレットを移動
int jumpPosition = calculateCharacterOffset(editorLines, targetIndex);
editor.positionCaret(jumpPosition);
editor.requestFocus();
}
}
}
// 文字列から行番号を抽出する簡易パーサー
private int parseLineNumber(String lineText) {
try {
// 例: "Line 12" のように記述されている場合の抽出
if (lineText.contains("Line ")) {
String numStr = lineText.replaceAll("[^0-9]", "");
return Integer.parseInt(numStr);
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
return -1;
}
// 指定したインデックス(行)の開始位置の文字数を計算
private int calculateCharacterOffset(String[] lines, int targetIndex) {
int offset = 0;
for (int i = 0; i < targetIndex; i++) {
offset += lines[i].length() + 1; // +1 は改行文字分
}
return offset;
}
}
処理のポイント
行の特定: 現在の選択位置から substring で切り出し、改行文字(\n)の数を数えることでカーソル行のインデックスを特定します。
文字列の解析: parseLineNumber メソッドで、「該当行に書かれた情報」から正規表現などを用いて移動先の行番号を数値化します。
エディタへの反映: editor.positionCaret() メソッドを使用して、算出した文字オフセットの位置にエディタのカーソルを移動させます。