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
機能しますが、これによりコードが少し混乱し、保守が困難になるのではないかと心配しています。他の提案は大歓迎です!