如何在Textarea中搜索单词

时间:2014-11-13 10:06:03

标签: java search jtextarea

我想突出显示从Caret Position到Textarea结尾的单词然后突出显示从textarea的开始到结束的单词然后以循环方式重复该过程。我的代码仅适用于当前插入位置到textarea的结尾。请检查一次。

我的代码:

public void highLightWholeWord(JTextArea component, String patteren) {
try {
    Document doc = component.getDocument();
    String text = component.getText(0, doc.getLength());
    int pos = component.getCaretPosition();
    boolean found = false;
    int findLength = patteren.length();
    // Rest the search position if we're at the end of the document
    if (pos + findLength > doc.getLength()) {
        pos = 0;
    }
    while (pos + findLength <= doc.getLength()) {
        // Extract the text from teh docuemnt
        String match = doc.getText(pos, findLength).toLowerCase();
        // Check to see if it matches or request
        if (match.equals(patteren)) {
            if (pos - 1 >= 0
                        && Character.isWhitespace(doc.getText(pos - 1, 1).charAt(0))
                                        || Character.isWhitespace(doc.getText(findLength, 1).charAt(0))) {
                if (pos + findLength == doc.getLength()
                                             || Character.isWhitespace(doc.getText(pos + findLength, 1).charAt(0))) {
                    found = true;
                    break;
                }
            }
        }
        pos++;
    }
    if (found) {
    component.setSelectionStart(pos);
    component.setSelectionEnd(pos + patteren.length());
    component.getCaret().setSelectionVisible(true);
    }
} 
catch (Exception e) {
    e.printStackTrace();
}
}

1 个答案:

答案 0 :(得分:0)

让我们看一个例子,假设我们正在搜索“xxx”这个词。假设您上次单击按钮时选择了最后一个xxx:

  

xxx ttt aaa xxx fff xxx yyy xxx zzz

此文字的大小为35个字符。

现在,插入位置位于突出显示的xxx(位置31)的末尾。模式长度为3.您有一个if条件:

if (pos + findLength > doc.getLength()) {
    pos = 0;
}

现在,pos + findLength31+3,即34。因此大于doc.getLength()。所以它不会设置pos = 0

因此,您将从第31位开始搜索xxx,但此处不再有xxx。只需zzz。最终,您将到达文档的末尾,并且不会设置found。因此选择不会改变,插入符号将保持在第31位。

所以无论你按下按钮多少次,都会发生同样的事情。

这意味着您设置pos=0的条件有误。它只有在xxx完全是最后一个字的情况下才有效。

以下是解决此问题的建议:

用另一种方法定义你的病情​​:

public boolean foundPattern( Document doc, int pos, int findLength  ) {
    String match = doc.getText(pos, findLength).toLowerCase();
    // Check to see if it matches or request
    if (match.equals(patteren)) {
        if (pos - 1 >= 0
                    && Character.isWhitespace(doc.getText(pos - 1, 1).charAt(0))
                                    || Character.isWhitespace(doc.getText(findLength, 1).charAt(0))) {
            if (pos + findLength == doc.getLength()
                                         || Character.isWhitespace(doc.getText(pos + findLength, 1).charAt(0))) {
                return true;
            }
        }
    }
    return false;
}

这只是为了让实际的部分写得更容易:

while (pos + findLength <= doc.getLength()) {

   found = foundPattern( doc, pos, findLength );

   if ( found ) {
      break;
   }

   pos++;

}

if ( ! found ) {
   pos = 0;

   while ( pos + findLength < component.getCaretPosition() ) {
       found = foundPattern( doc, pos, findLength );
       if ( found ) {
          break;
       }

       pos++;
   }
}

所以现在你有两个循环。如果第一个没有找到模式(从插入位置到文档末尾),那么第二个开始从文档开始到插入位置。