Java JScrollPane的内存使用
我有一个Java(Swing)数据记录应用程序将文本写入Java JScrollPane的内存使用,java,swing,memory-leaks,jscrollpane,jtextarea,Java,Swing,Memory Leaks,Jscrollpane,Jtextarea,我有一个Java(Swing)数据记录应用程序将文本写入JTextArea中的JScrollPane。应用程序将文本附加到JTextArea,并相应地向上滚动。在可视区域中只有5行文本,如果用户只能向后滚动100行左右是可以接受的,但在我看来,消耗的内存量将继续无限增长 我能做些什么来限制保留的行数或限制使用的内存量吗?滚动窗格与此无关。您可以限制JTextArea使用的PlainDocument所持有的数据。我认为DocumentFilter可以用于此目的 编辑1 这是camickr代码的一个
JTextArea
中的JScrollPane
。应用程序将文本附加到JTextArea
,并相应地向上滚动。在可视区域中只有5行文本,如果用户只能向后滚动100行左右是可以接受的,但在我看来,消耗的内存量将继续无限增长
我能做些什么来限制保留的行数或限制使用的内存量吗?滚动窗格与此无关。您可以限制JTextArea使用的PlainDocument所持有的数据。我认为DocumentFilter可以用于此目的 编辑1
这是camickr代码的一个简单的DocumentFilter版本(Rob:对彻头彻尾的盗窃行为表示抱歉!) 以及测试它的代码:
import javax.swing.*;
import javax.swing.text.PlainDocument;
public class LimitLinesDocumentFilterTest {
private static void createAndShowUI() {
int rows = 10;
int cols = 30;
JTextArea textarea = new JTextArea(rows , cols );
PlainDocument doc = (PlainDocument)textarea.getDocument();
int maxLineCount = 9;
doc.setDocumentFilter(new LimitLinesDocumentFilter(maxLineCount ));
JFrame frame = new JFrame("Limit Lines Document Filter Test");
frame.getContentPane().add(new JScrollPane(textarea));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
滚动窗格与此无关。您可以限制JTextArea使用的PlainDocument所持有的数据。我认为DocumentFilter可以用于此目的 编辑1
这是camickr代码的一个简单的DocumentFilter版本(Rob:对彻头彻尾的盗窃行为表示抱歉!) 以及测试它的代码:
import javax.swing.*;
import javax.swing.text.PlainDocument;
public class LimitLinesDocumentFilterTest {
private static void createAndShowUI() {
int rows = 10;
int cols = 30;
JTextArea textarea = new JTextArea(rows , cols );
PlainDocument doc = (PlainDocument)textarea.getDocument();
int maxLineCount = 9;
doc.setDocumentFilter(new LimitLinesDocumentFilter(maxLineCount ));
JFrame frame = new JFrame("Limit Lines Document Filter Test");
frame.getContentPane().add(new JScrollPane(textarea));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
我能做些什么来限制保留的行数吗
请参阅:
我能做些什么来限制保留的行数吗
请参阅:。是的,DocumentListener也可以工作(1+),但是您需要使用camickr的技巧在EDT上的可运行队列中更新文档,以便允许侦听器修改文档。谢谢camickr-我将尝试您的方法。感谢您的回复。SteveYep,DocumentListener也可以工作(1+),但是您需要使用camickr的技巧,在EDT上的可运行队列中更新文档,以便允许侦听器修改文档。谢谢camickr-我将尝试您的方法。感谢您的回复。Steve@camickr:罗布,很抱歉你的密码被彻底偷走了/Pete@SteveJP:使用文档过滤器的缺点是每个文档只能有一个过滤器(据我所知)。+1,皮特,没问题,这就是示例的目的,建议/尝试不同的方法。是的,一个文档只能有一个筛选器。为了它的价值,我尝试在“链接文档过滤器”(linkingdocumentfilters)中解决这个问题。谢谢气垫船,您已经遇到了很多麻烦。我来试试。@camickr:Rob,很抱歉你的密码被彻底偷走了/Pete@SteveJP:使用文档过滤器的缺点是每个文档只能有一个过滤器(据我所知)。+1,皮特,没问题,这就是示例的目的,建议/尝试不同的方法。是的,一个文档只能有一个筛选器。为了它的价值,我尝试在“链接文档过滤器”(linkingdocumentfilters)中解决这个问题。谢谢气垫船,您已经遇到了很多麻烦。我要试一试。