2012-04-26 107 views
0

我有一個看似很小的問題,但在過去的兩天裏我找不到明確的答案。我創建了一個自動完成的拼寫檢查器,用於檢查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

我會建議使用現有的組件試圖自己實現語法高亮。你應該嘗試[RSyntaxTextArea](http://fifesoft.com/rsyntaxtextarea/),它是一個內置了這種功能的JTextArea。它是開放源代碼並且非常可擴展。甚至有一個自動完成框架。 – predi 2012-04-26 09:41:12

+0

@predi感謝這篇文章,但我不允許使用任何外部程序或數據結構。這是該項目的目標。我會看看源代碼。 – SuperMario 2012-04-26 10:10:10

回答

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