Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JScrollPane的内存使用_Java_Swing_Memory Leaks_Jscrollpane_Jtextarea - Fatal编程技术网

Java JScrollPane的内存使用

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代码的一个

我有一个Java(Swing)数据记录应用程序将文本写入
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)中解决这个问题。谢谢气垫船,您已经遇到了很多麻烦。我要试一试。