2012-04-26 14 views
0

私は一見小さな問題を抱えていますが、過去2日間で明確な答えが見つかりませんでした。私はJTextPane(mainTxtTypeAreaと呼ばれる)をチェックする自動補完スペルチェッカーを作成しています。ユーザーが現在作業している現在の単語を取得することができますが、開始および終了のインデックスが付いていますが、特定の単語をハイライトしたいときは、入力した単語を超えてハイライトが続きます。これは、ドキュメントイベントが発生したときに呼び出されるコードです。ハイライトを開始および停止する方法は?

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) {} 
     } 

私は他の選択肢もあります。私はスタイルを使用しようとしましたが、スタイルはドキュメントのリスナーに適用できないため、例外がスローされます。

+0

独自の構文強調を実装しようとするよりも、既存のコンポーネントを使用することをお勧めします。このような機能を組み込んだJTextAreaである[RSyntaxTextArea](http://fifesoft.com/rsyntaxtextarea/)を試してみてください。オープンソースで非常に拡張性があります。オートコンプリートのフレームワークもあります。 – predi

+0

@predi投稿に感謝しますが、私は外部プログラムやデータ構造を使用することはできません。それがプロジェクトの目的です。私はソースコードを見てみましょう。 – SuperMario

答えて

1

いいえ、私は代わりを見つけました。ドキュメントリスナーを使用する代わりに、KeyReleasedアクションイベントを使用してテキストペインを監視し、誤った単語を赤いイタリックにします。コードは次のとおりです。

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); 
    } 
}