2

我正在使用 JTextPane 记录来自网络应用程序的一些数据,并且在程序运行大约 10 多个小时后出现内存堆错误。文本继续添加到 JTextPane 中,这不断增加内存使用量。无论如何我可以让 JTextPane 像命令提示符窗口一样工作吗?随着新文本的出现,我应该摆脱旧文本吗?这是我用来写入 JTextPane 的方法。

volatile JTextPane textPane = new JTextPane();
public void println(String str, Color color) throws Exception
{
    str = str + "\n";
    StyledDocument doc = textPane.getStyledDocument();
    Style style = textPane.addStyle("I'm a Style", null);
    StyleConstants.setForeground(style, color);
    doc.insertString(doc.getLength(), str, style);
}
4

2 回答 2

3

一旦其长度超过某个限制,您可以从 StyledDocument 的开头删除等量的数量:

int docLengthMaximum = 10000;
if(doc.getLength() + str.length() > docLengthMaximum) {
    doc.remove(0, str.length());
}
doc.insertString(doc.getLength(), str, style);
于 2012-07-14T16:55:50.837 回答
2

您需要利用 Documents DocumentFilter

public class SizeFilter extends DocumentFilter {

    private int maxCharacters;
    public SizeFilter(int maxChars) {
        maxCharacters = maxChars;
    }

    public void insertString(FilterBypass fb, int offs, String str, AttributeSet a)
        throws BadLocationException {
        if ((fb.getDocument().getLength() + str.length()) > maxCharacters)
            int trim = maxCharacters - (fb.getDocument().getLength() + str.length()); //trim only those characters we need to
            fb.remove(0, trim);
        }
        super.insertString(fb, offs, str, a);
    }

    public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
        throws BadLocationException {

        if ((fb.getDocument().getLength() + str.length() - length) > maxCharacters) {
            int trim = maxCharacters - (fb.getDocument().getLength() + str.length() - length); // trim only those characters we need to
            fb.remove(0, trim);
        }
        super.replace(fb, offs, length, str, a);
    }
}

基于来自http://www.jroller.com/dpmihai/entry/documentfilter的字符限制过滤器

您需要将其应用于文本区域 Text 组件,因此...

((AbstractDocument)field.getDocument()).setDocumentFilter(...)
于 2012-07-14T17:10:47.453 回答