我正在尝试创建一个突出显示文本区域中相应单词的搜索栏。我遇到的问题是下面的代码示例仅突出显示文本区域中第一次出现的单词,即它不扫描整个文本区域。如何设置以便突出显示所有出现的关键字?
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类尝试了以下修复,但它仍然无效。
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();
}
}
答案 0 :(得分: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);
}
您还需要更改您的最终其他内容以进行另一项检查以查看它是否存在(您可以通过多种方式执行此操作)。
答案 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循环将搜索整个conent-string并将所有出现的关键字发送到addHighlight-method。
答案 2 :(得分: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);
}
...
这可能不是最优化的代码,但应该有效。