2012-04-26 2 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); 
    } 
} 
관련 문제