2016-03-19 11 views
1

Ich versuche, ein JTextPane zu machen, das eine Art Texteditor enthält, wo bestimmte Wörter oder Symbole unterschiedliche Vordergrundfarben oder Schriftart haben. Bisher finde ich die Art und Weise, um die Farbe zu Worte zu ändern, wie folgt aus:Wie man Farbe zu bestimmten Symbolen in einem JTextPane ändert [Java]

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

public class Test extends JFrame { 

    private int findLastNonWordChar(String text, int index) { 
     while (--index >= 0) { 
      if (String.valueOf(text.charAt(index)).matches("\\W")) { 
       break; 
      } 
     } 
     return index; 
    } 

    private int findFirstNonWordChar(String text, int index) { 
     while (index < text.length()) { 
      if (String.valueOf(text.charAt(index)).matches("\\W")) { 
       break; 
      } 
      index++; 
     } 
     return index; 
    } 

    public Test() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(400, 400); 
     setLocationRelativeTo(null); 

     final StyleContext cont = StyleContext.getDefaultStyleContext(); 
     final AttributeSet attr = cont.addAttribute(cont.getEmptySet(), StyleConstants.Foreground, Color.RED); 
     final AttributeSet attrBlack = cont.addAttribute(cont.getEmptySet(), StyleConstants.Foreground, Color.BLACK); 
     DefaultStyledDocument doc = new DefaultStyledDocument() { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void insertString(int offset, String str, AttributeSet a) throws BadLocationException { 
       super.insertString(offset, str, a); 

       String text = getText(0, getLength()); 
       int before = findLastNonWordChar(text, offset); 
       if (before < 0) { 
        before = 0; 
       } 
       int after = findFirstNonWordChar(text, offset + str.length()); 
       int wordL = before; 
       int wordR = before; 

       while (wordR <= after) { 
        if (wordR == after || String.valueOf(text.charAt(wordR)).matches("\\W")) { 
         if (text.substring(wordL, wordR).matches("(\\W)*(private|public|protected)")) { 
          setCharacterAttributes(wordL, wordR - wordL, attr, false); 
         } else { 
          setCharacterAttributes(wordL, wordR - wordL, attrBlack, false); 
         } 
         wordL = wordR; 
        } 
        wordR++; 
       } 
      } 

     }; 
    } 

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

Mein Problem ist, wenn die Farbe der Symbole ‚->‘ ändern sollte. Wenn ich "->" statt "privat" oder "öffentlich" anwende, funktioniert das nicht. Können Sie mir helfen, einen Weg zu finden, dies zu tun? Dank

Antwort

0

prüfen diese Probe (aus früheren Veröffentlichungen aufgenommen):

public static void main(String[] args) { 
    JTextPane jtp = new JTextPane(); 
    StyledDocument doc = jtp.getStyledDocument(); 

    Style style = jtp.addStyle("Red coloured text", null); 
    StyleConstants.setForeground(style, Color.red); 

    try { doc.insertString(doc.getLength(), "Style text",style); } 
    catch (BadLocationException e){} 

    StyleConstants.setForeground(style, Color.blue); 

    try { doc.insertString(doc.getLength(), "Style text 2",style); } 
    catch (BadLocationException e){} 

    JFrame frame = new JFrame("ColourCheck"); 
    frame.getContentPane().add(jtp); 
    frame.pack(); 
    frame.setVisible(true); 
}