2014-09-17 5 views
3

XML 문자열을 포함하는 JTextPane이 있는데 XML 열기 태그의 색을 변경하고 싶습니다. 이렇게하려면 정규식을 사용하여 시작 태그를 찾은 다음 관련 텍스트 인덱스의 문자 특성을 선택한 색상으로 설정합니다. 이것은 다음 코드에서 볼 수 있습니다 :JTextPane 및 regex 문제

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는 개행 문자를 무시 것처럼 것 같다) 다르게 증가하는 표시이다.

enter image description here

문제는 while 루프에서 System.out.println(matcher.group()); 다음 올바른 출력을 계시 같이 정규식 자체 아니다 :

지속적으로 증가하는 Matcher.start()StyledDocument.setCharacterAttributes() 강제하는 방법이 , 또는 새로운 라인 카운터를 구현해야합니까?

편집 : Schlagi 제안으로 \n 작업을 수행하는 모든 \r\n으로, 그러나 나는 이것이 약간의 혼란 및 유지 보수가 어려운 코드를 만들어 걱정, 교체. 다른 제안을 환영합니다!

답변

1

왜 JTextPane이 잘못했는지 알 수 없습니다. 스타일 문서에서 생각하는 것, "\r\n"은 단 한 문자 일 수 있습니다. 이유를 묻지 마십시오.

당신은

작동
String nLine = "\n"; 

에 선

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

을 변경하는 경우. JTextPane은 모든 OS에서 개행을 위해 "\n" 만 필요합니다.

+0

실제 응용 프로그램에서는 입력 XML이 \ r \ n을 줄 분리 자로 사용하므로 작동하지 않습니다. – Hungry

+0

해결 방법은 모든 ""\ n \ "를'"\ n "'으로 바꾸는 것입니다. – schlagi123

+0

@ btrs20 [DefaultEditorKit 개행 (Java Platform SE 8)] (http://docs.oracle.com/javase/8/docs/api/javax/swing/text/DefaultEditorKit.html) – aterai