2013-03-02 3 views
2

Donc Im en essayant d'écrire un éditeur simple. Je veux colorier sorcière grise tous les caractères sont entre « caractères Fragment qui le fait est:.JTextPane couleur tout au lieu de quelques caractères

class MainPanel extends JPanel { 

private int WIDTH = 800; 
private int HEIGHT = 500; 
private JTextPane codePane = new JTextPane(); //Pole, w które wpisywany jest kod 
private JLabel codeLabel = new JLabel("JNotepad"); 
private StyledDocument doc = codePane.getStyledDocument(); 
private final String[] keywords; //Słowa kluczowe 
private final Map<String, String> shortcuts = new HashMap<>(); //syso -> System.out.println() itp. 

MainPanel() { 
    setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
    setLayout(new BorderLayout()); 
    //Dodanie głównego pola w polu przewijanym 
    JScrollPane scroll = new JScrollPane(codePane); 
    add(scroll, BorderLayout.CENTER); 
    add(codeLabel, BorderLayout.SOUTH); 
    codePane.addKeyListener(new KeyHandler()); 
    codePane.setFont(new Font("Monospaced", Font.PLAIN, 15)); 
    //Załadowanie słów kluczowych 
    Scanner in = new Scanner(getClass().getResourceAsStream("res/keywords.txt")); 
    List<String> words = new LinkedList<>(); 
    while (in.hasNext()) { 
     words.add(in.nextLine()); 
    } 
    keywords = words.toArray(new String[words.size()]); 
    in.close(); 
} 


private class KeyHandler extends KeyAdapter { 

    @Override 
    public void keyReleased(KeyEvent ev) { 
     highlight(); 
    } 


    private void highlight() { 
     String code = codePane.getText(); 
     //Zmiana koloru słów kluczowych 
     String[] words = code.replaceAll("\\(|\\)|\\{|\\}|\\[|\\]", " ").split("\\s"); 
     int lastIndex = 0; 
     for (int a = 0; a < words.length; a++) { 
      SimpleAttributeSet set = new SimpleAttributeSet(); 
      if (Arrays.asList(keywords).contains(words[a])) { 
       StyleConstants.setForeground(set, Color.BLUE); 
      } 
      doc.setCharacterAttributes(lastIndex, lastIndex + words[a].length(), set, true); 
      //Zwiekszenie ostatniego indexu 
      lastIndex += words[a].length() + 1; //+1 bo jeszcze spacja 
     } 
    } 
} 

}

Lorsque » se produit, il peint des caractères gris, mais il peint tous les caractères après le premier signe "Qu'est-ce. mal avec ce code EDIT: vous êtes, voici le code complet

Répondre

3

deuxième argument en setCharacterAttributes() est une longueur, pas fin index. C'était ton problème.

 boolean isString = false; 
     char[] text = code.toCharArray(); 
     for (int i = 0; i < text.length; i++) { 
      if (text[i] == '\"') { 
       isString = !isString; 
       if(!isString) { 
        document.setCharacterAttributes(i, 1, attributes, true); 
       } 
      } 
      if (isString) { 
       document.setCharacterAttributes(i, 1, attributes, true); 
      } 
     } 

question originale était plus courte avec seulement quelques lignes de code, mais mKorbel a droite:

... dans ce cas (il est a) l'emploi pour DocumentFilter, ne jamais utiliser KeyListener pour JTextComponent.

Vous devriez vérifier cela, il pourrait aider: How to Write a Document Listener

+0

Votre soulution ne fonctionne pas + que voulez-vous dire par "\"? – user2102972

+0

Eh bien, c'est le cas. Pour code = "test1 \" test2 \ "test3 test4 \" test5 \ "" il imprime test2test5 sans guillemets. – rebeliagamer

+0

Mais mon problème n'est pas d'imprimer correctement mais de bien colorier les lettres du volet. Les lettres après le guillemet sont toujours colorées ce qui est mauvais comportement. Et aussi je veux que les marques de qutation soient colorées aussi. Si vous voulez je peux vous donner le code entier pour voir le problème – user2102972

0

Parce que la condition est vraie if (string) sera vrai String sera donné vrai une fois equals("\"")) .Donc il porter sur tout pour l'autre... chaîne

Dans la méthode bloc if (string){.....}, à la fin faire string=false

+0

Ce n'est pas. Disons que j'écris dans JPane: | du texte "chaîne" plus de texte | "du texte" sera coloré en noir (par défaut). alors "se produit donc la chaîne est vraie" de s à g ("string") nous colorons en gris puis "se produit à nouveau donc la chaîne est FALSE. ce qui signifie que "plus de texte" devrait être de couleur noire alors qu'il est gris – user2102972

Questions connexes