2012-04-26 2 views
0

J'ai apparemment un petit problème, mais je n'ai pas trouvé de réponse claire au cours des 2 derniers jours. Je suis en train de créer un vérificateur orthographique automatique qui vérifie un JTextPane (appelé mainTxtTypeArea). Je peux obtenir le mot courant sur lequel l'utilisateur travaille, avec ses index de début et de fin, mais quand je veux seulement souligner le mot spécifique, le surligneur continuera juste au-delà du mot tapé. Ce code est appelé lorsqu'un événement de document se produit:Comment démarrer et arrêter les hautes lumières?

public void checkWord(DocumentEvent e) { 
      try { 
       Highlighter redZigZag = mainTxtTypeArea.getHighlighter(); 
       int start = Utilities.getWordStart(mainTxtTypeArea, e.getOffset()); 
       int end = Utilities.getWordEnd(mainTxtTypeArea, e.getOffset()); 
       int length = end - start; 
       String word = mainTxtTypeArea.getDocument().getText(start, length); 

       if(dictionary.find(word) == false && Character.isWhitespace(word.charAt(0)) == false){ 
        System.out.println("Incorrect: "+word); 
        //I found a zigzag highlighter online, but the default yields the same result 
        redZigZag.addHighlight(start, end, painter); 
       } else { 
        System.out.println("Correct: "+word); 
       } 

      } catch (BadLocationException ex) {} 
     } 

Je suis également ouvert à toutes les alternatives. J'ai essayé d'utiliser Styles, mais cela crée une exception, car les styles ne peuvent pas être appliqués dans un écouteur de document.

+0

Je suggérerais d'utiliser un composant existant plutôt que d'essayer d'implémenter la coloration syntaxique par vous-même. Vous devriez essayer [RSyntaxTextArea] (http://fifesoft.com/rsyntaxtextarea/) qui est un JTextArea avec une telle fonctionnalité intégrée. Il est open-source et très extensible. Même a un cadre d'auto-complétion. – predi

+0

@predi Merci pour la publication, mais je ne suis pas autorisé à utiliser des programmes externes ou des structures de données. C'est le but du projet. Je vais jeter un oeil au code source si. – SuperMario

Répondre

1

OK, j'ai trouvé une alternative. Au lieu d'utiliser un écouteur de document, j'utilise un événement d'action KeyReleased pour surveiller mon volet de texte, puis je mets simplement en italique le mot mal orthographié en rouge. Le code est ci-dessous:

private void mainTxtTypeAreaKeyReleased(java.awt.event.KeyEvent evt) { 
    checkWord(); 
} 

private void checkWord() { 
    try { 
     int start = Utilities.getWordStart(mainTxtTypeArea, mainTxtTypeArea.getCaretPosition()); 
     int end = Utilities.getWordEnd(mainTxtTypeArea, mainTxtTypeArea.getCaretPosition()); 
     int length = end - start; 

     if(length > 0) { 
      StyledDocument doc = mainTxtTypeArea.getStyledDocument(); 
      SimpleAttributeSet as = new SimpleAttributeSet(); 

      if(dictionary.find(doc.getText(start, length)) == false){ 
       StyleConstants.setItalic(as, true); 
       StyleConstants.setForeground(as, Color.red); 
      } else { 
       StyleConstants.setItalic(as, false); 
       StyleConstants.setForeground(as, Color.BLACK); 
      } 
      doc.setCharacterAttributes(start, length, as, false); 
     } 
    } catch (BadLocationException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
Questions connexes