0

我正在尝试在 NetBeans 中使用简单的功能实现文本编辑器,例如:文本样式(粗体、斜体、下划线...)、打开文件、保存文件和搜索。搜索功能在文档中搜索指定的字符串并突出显示结果。当我试图删除这些亮点或为不同的搜索添加新的亮点时,就会出现问题。目前我将 StyledDocument 对象与 jTextPane 一起使用。

private void textHighlight(int startAt, int endAt, Color c) {
    Style sCh;
    sCh = textEditor.addStyle("TextBackground", null);
    StyleConstants.setBackground(sCh, c);                   
    StyledDocument sDoc = textEditor.getStyledDocument();
    sDoc.setCharacterAttributes(startAt, endAt - startAt, sCh, false);
}

private void textFind(java.awt.event.ActionEvent evt) {
    int searchIndex = 0;                         
    String searchValue = searchField.getText();
        if(lastIndex != -1) {  
            while(searchIndex < lastIndex) {   
                countOccurencies++;
                int i = textEditor.getText().indexOf(searchValue, searchIndex);                   
                 textHighlight(i, i+searchValue.length(), Color.MAGENTA);
                searchIndex = i+searchValue.length();
            }
            statusLabel.setText(countOccurencies + " rezultatov.");
        } else {
            statusLabel.setText("Ni rezultatov!");
        }
    }
}  

private void searchEnd(java.awt.event.ActionEvent evt) {
    textEditor.removeStyle("TextBackground");
}

removeStyle() 似乎不起作用。

4

1 回答 1

2

必须承认我不知道样式是如何工作的,但也许样式的属性在您添加样式时被复制到文档中?

另一种选择是使用 Highlighter 类。请参阅 textPane.getHighlighter()。然后,您可以跟踪在 ArrayList 中添加的各个突出显示,然后在需要清除文本平移时使用 ArrayList 删除突出显示。

此外,在您的搜索循环中,您有几个问题:

  1. 不要使用 getText() 方法。这可能会导致文本窗格中的每一行文本的文本偏移量减少一个问题。有关更多信息和解决方案,请参阅文本和换行

  2. 您正在循环中获取文本,这不是很有效。您应该只在循环外获得一次文本。

于 2014-03-29T16:34:04.283 回答