NetBeans中的文本编辑器

时间:2014-03-29 16:20:24

标签: java swing netbeans jtextpane swing-highlighter

我正在尝试使用简单的函数在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()似乎无法正常工作。

1 个答案:

答案 0 :(得分:2)

必须承认我不知道样式的工作原理,但是在添加样式时,样式的属性可能会复制到文档中吗?

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

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

  1. 不要使用getText()方法。对于文本窗格中的每行文本,这可能会导致文本偏移关闭一个问题。有关详细信息和解决方案,请参阅Text and New Lines

  2. 您在循环中获取的文本效率不高。您应该只在循环外获取文本。