我想突出显示从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();
}
}
答案 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 + findLength
为31+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++;
}
}
所以现在你有两个循环。如果第一个没有找到模式(从插入位置到文档末尾),那么第二个开始从文档开始到插入位置。