2014-03-27 97 views
0

我正在嘗試創建一個搜索欄,突出顯示文本區域中的相應單詞。我有的問題是下面的代碼示例只突出顯示文本區域中第一個出現的單詞,即它不掃描整個文本區域。我該如何做到這一點,以便突出顯示所有關鍵字?通過jTextArea掃描單詞

public void keywordSearch() { 
    hilit.removeAllHighlights(); 
    String keyword = txtSearch.getText(); 
    String content = txtArea.getText(); 
    int index = content.indexOf(keyword, 0); 
    if (index >= 0) { // if the keyword was found 
     try { 

      int end = index + keyword.length(); 
      hilit.addHighlight(index, end, painter); 
      txtSearch.setBackground(Color.WHITE); 

     } catch (BadLocationException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     txtSearch.setBackground(ERROR_COLOR);// changes the color of the text field if the keyword does not exist 
    } 
} 

我曾嘗試使用掃描儀類以下修補程序,但它仍然無法正常工作。

Scanner sc = new Scanner(content); 

    if (index >= 0) { // if the keyword was found 
     try { 
      while(sc.hasNext() == true) 
      { 
       int end = index + keyword.length(); 
       hilit.addHighlight(index, end, painter); 
       txtSearch.setBackground(Color.WHITE); 
       sc.next(); 
      } 

任何幫助,非常感謝。提前致謝。使用while循環(進入無限循環)

修復

while(index >= 0) { // if the keyword is found 
     try { 
      int end = index + keyword.length(); 
      hilit.addHighlight(index, end, painter); 
      txtSearch.setBackground(Color.WHITE); 
      index = content.indexOf(keyword, index); 
      System.out.println("loop");// test to see if entered infinite loop 

     } catch (BadLocationException e) { 
      e.printStackTrace(); 
     } 
    } 

回答

1

的關鍵是在這裏:

int index = content.indexOf(keyword, 0); 
if (index >= 0) { // if the keyword was found 

更改爲一個while循環從索引中再次搜索,你第一時間發現:

int index = content.indexOf(keyword, 0); 
while (index >= 0) { // if the keyword was found 
    // Do stuff 
    index = content.indexOf(keyword, index); 
} 

您還需要更改您的最終else以做另一個檢查,看它是否根本不存在(有幾種方法可以做到這一點)。

+0

試過這個,但它進入了一個無限循環。 – user3469429

+0

@ user3469429您可能需要從第二個索引+ 1進行掃描。 –

0

你只是在尋找一個單詞的發生。

... 
for(int i = 0; i < content.length(); i++){ 

    int index = content.indexOf(keyword, i); 
    if (index >= 0) { // if the keyword was found 

    int end = index + keyword. 
    hilit.addHighlight(index, end, painter); 
    txtSearch.setBackground(Color.WHITE); 

    } 
... 

這個for-loop將搜索整個conent-string並將關鍵字的所有出現都發送到addHighlight-method。

+0

呃。不要這樣做。它會「起作用」,因爲它確實會突出顯示每個單詞,但它效率非常低,因爲您會一遍又一遍地重複查找和突出顯示同一個單詞。 –

0
... 
ArrayList<Integer> keywordIndexes = new ArrayList<Integer>(); 
int index = content.indexOf(keyword, 0); 
for(int i = 0; i < content.length(); i++){ 
    if (index >= 0) { // if keyword found 

    int end = index + keyword.length(); 
    keywordIndexes.add(index); // Add index to arraylist 
    keywordIndexes.add(end); // Add end to next slot in arraylist 
} 

for(int j = 0; j < keywordIndexes.size(); j+=2){ 
    hilit.addHighlight(j, (j+1), painter); 
    txtSearch.setBackground(Color.WHITE); 
} 
... 

這可能不是最優化的代碼,但它應該工作。