1

私が取り組んでいるアプリの一部には、テキスト検索機能を備えたログ ファイル ビューアーが含まれておりJTextField#getText()、次のようにパターン マッチャーを呼び出します。

Matcher m = somePattern.matcher(textField.getText());
m.find(startPosn);
System.out.println("startPosn: " + m.start());
System.out.println("endPosn: " + m.end());

ここで、textField は JTextField であり、
startPosn はテキスト フィールドの現在のキャレット位置に設定されます

ただし、これによって返される開始位置と終了位置は、 Windows でのみ誤った開始位置と終了位置を返します。 開始位置と終了位置の両方が本来あるべき位置よりも X だけ多くなっています。ここで、X は、textField で startPosn までに改行が検出された回数です。

\r\nこれは Linux では発生しないので、改行 (と\n)の処理方法の違いによるものではないかと思います。

私は何か間違ったことをしていますか?どうすればこれを回避できますか?

実装 解決:

camickr によってリンクされた TFA の例を使用して変更されました。

Matcher m = somePattern.matcher(textField.getDocument().getText(0, textField.getDocument().getLength()));
m.find(startPosn);
System.out.println("startPosn: " + m.start());
System.out.println("endPosn: " + m.end());

注: 最初の行のみが変更されました。

これにより、Linux と Windows の両方で正しい出力が得られました。

4

2 に答える 2

3

新しい行(\ r \nと\n)の処理方法の違いに関係しているのではないかと思います。

はい、それはWindowsの問題です。

ただし、JTextFieldには新しい行の文字列が含まれていないため、問題が発生することはないと思います。

JTextAreaとJTextPaneでこれを処理する方法を説明するTextとNewLinesを読むことをお勧めします。

さらにサポートが必要な場合は、問題を示しているSSCCEを投稿してください。

于 2009-11-02T06:18:58.607 に答える
1

次のようなものを使用できます。

String text = textField.getText();
text.replaceAll(System.getProperty("line.separator"), "\n");

それからあなたのことをしてください。上記のコードで、「\n」を必要に応じたものに置き換えることができます。

于 2009-11-02T06:08:09.110 に答える