3

XML 文字列を含むがJTextPaneあり、XML 開始タグの色を変更したいと考えています。これを行うには、正規表現を使用して開始タグを見つけ、関連するテキスト インデックスの文字属性を選択した色に設定します。これは、次のコードで確認できます。

import java.awt.*;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.text.*;

public class Test {
    String nLine = java.lang.System.getProperty("line.separator"); 
    String xmlString = "<ROOT>" + nLine + "  <TAG>Tag Content</TAG>" + nLine + "  <TAG>Tag Content</TAG>" + nLine + "  <TAG>Tag Content</TAG>" + nLine + "</ROOT>";

    public Test(){
        JTextPane XMLTextPane = new XMLTextPane();
        JScrollPane pane = new JScrollPane(XMLTextPane);
        pane.setPreferredSize(new Dimension(500,100));
        JOptionPane.showConfirmDialog(null, pane);
    }

    class XMLTextPane extends JTextPane{
        public XMLTextPane(){
            super.setText(xmlString);
            StyleContext context = new StyleContext();
            Style openTagStyle = context.addStyle("Open Tag", null);
            openTagStyle.addAttribute(StyleConstants.Foreground, Color.BLUE);
            StyledDocument sdocument = this.getStyledDocument();

            Pattern pattern = Pattern.compile("<([a-z]|[A-Z])+");
            Matcher matcher = pattern.matcher(super.getText());
            while (matcher.find()) {
                sdocument.setCharacterAttributes(matcher.start(), matcher.group().length() , openTagStyle, true);
            }
        }
    }

    public static void main(String[] args){
        new Test();
    }
}

ただし、問題は、Matcher.start()とのStyledDocument.setCharacterAttributes()増分が異なるように見える (StyledDocument改行文字を無視しているように見える) ため、色付きのテキストがずれてしまうことです。

ここに画像の説明を入力

System.out.println(matcher.group());while ループ内の a は次の正しい出力を明らかにするため、問題は正規表現自体にはありません。

<ROOT
<TAG
<TAG
<TAG

強制Matcher.start()StyledDocument.setCharacterAttributes()て一貫してインクリメントする方法はありますか、それとも新しい行カウンターを実装する必要がありますか?

編集: Schlagi が示唆したように、all\r\nをに置き換えても\n 機能しますが、これによりコードが少し混乱し、保守が困難になるのではないかと心配しています。他の提案は大歓迎です!

4

1 に答える 1

1

JTextPane が間違っている理由がわかりません。styledocument では、それ"\r\n"は 1 文字だけである可能性があります。理由を聞かないでください。

ラインを変えると

String nLine = java.lang.System.getProperty("line.separator"); 

String nLine = "\n";

できます。JTextPane は"\n"すべての OS で改行にのみ必要です

于 2014-09-17T13:05:43.807 に答える