2

問題: JTextPane でリッスンする CaretListener と DocumentListener があります。

JTextPane でどの行がキャレットであるかを判断できるアルゴリズムが必要です。ここに例を示します。

代替テキスト

結果:3行目

代替テキスト

結果:2行目

代替テキスト

結果:4行目

また、アルゴリズムがキャレットが JTextPane のどの行にあるかを判断できる場合、かっこの間にあるものを画像としてサブストリング化するのはかなり簡単なはずです (キャレットは の文字mにありますmetadata)。

代替テキスト

--

これは、JTextPane から取得したテキスト全体を文に分割する方法です。

String[] lines = textPane.getText().split("\r?\n|\r", -1);

内の文はtextPane\n で区切ります。

問題は、キャレットを操作して、キャレットがどの位置とどの行にあるかを知るにはどうすればよいですか? キャレットのドットがどの位置にあるかは知っていますが、どの行にあるかはわかりません。キャレットの行がわかっていれば、lines[<line number>]そこから文字列を操作できます。

要するに: CaretListener および/または DocumentListenerを使用して、キャレットが現在どの行にあるかを知り、その行を取得してさらに文字列を操作するにはどうすればよいですか? 助けてください。ありがとう。

さらに説明が必要な場合はお知らせください。御時間ありがとうございます。

4

3 に答える 3

9

リクエストしたソースコードは次のとおりです。

static int getLineOfOffset(JTextComponent comp, int offset) throws BadLocationException {
    Document doc = comp.getDocument();
    if (offset < 0) {
        throw new BadLocationException("Can't translate offset to line", -1);
    } else if (offset > doc.getLength()) {
        throw new BadLocationException("Can't translate offset to line", doc.getLength() + 1);
    } else {
        Element map = doc.getDefaultRootElement();
        return map.getElementIndex(offset);
    }
}

static int getLineStartOffset(JTextComponent comp, int line) throws BadLocationException {
    Element map = comp.getDocument().getDefaultRootElement();
    if (line < 0) {
        throw new BadLocationException("Negative line", -1);
    } else if (line >= map.getElementCount()) {
        throw new BadLocationException("No such line", comp.getDocument().getLength() + 1);
    } else {
        Element lineElem = map.getElement(line);
        return lineElem.getStartOffset();
    }
}

...

public void caretUpdate(CaretEvent e) {
    int dot = e.getDot();
    int line = getLineOfOffset(textComponent, dot);
    int positionInLine = dot - getLineStartOffset(textComponent, line);
    ...
}
于 2010-05-01T13:31:19.113 に答える
2

JTextPane.getStyledDocumentを使用してStyledDocumentの段落の概念を使用します。

カーソルの位置を使用すると、StyledDocument.getParagraph(pos)で現在の段落を知ることができます。次に、StyledDocument.getRootElementsと子から段落を繰り返しスローして、現在の段落の数、つまり現在の行の数を検索します。

英語でごめんなさい。

于 2010-05-01T13:30:04.310 に答える
1

これは、JTextPaneから取得したテキスト全体を文に分割する方法です。

あなたの解決策はあまり効率的ではありません。

まず、使用されているOSに関係なく、「\n」のみがドキュメントに保存されます。したがって、正規表現を単純化できます。

ただし、ドキュメント内の1行しか気にしないため、ドキュメント全体を解析するために正規表現を使用する必要はありません。Elementインターフェースについて理解したので、コードをより効率的にすることができます。

a)前に示したように行を取得し
ますb)ルート要素からその行で表される要素を取得できるようになりました
c)開始/終了オフセットとgetText(...)メソッドを使用してテキストのみを取得できるようになりましたその特定の行のために。

于 2010-05-01T16:01:28.213 に答える