通过jTextArea扫描单词

时间:2014-03-27 16:40:23

标签: java java.util.scanner jtextfield 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类尝试了以下修复,但它仍然无效。

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

3 个答案:

答案 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);
}
...

这可能不是最优化的代码,但应该有效。