int idealSize = 1000;
int maxExcess = 500;
int excess = textArea.getDocument().getLength() - idealSize;
if (excess >= maxExcess) {
   textArea.replaceRange("", 0, excess);
}

解决方案 »

  1.   

    if (this.jTextArea.getLineCount() > 2000) {
    this.jTextArea.setText("");
    }
    this.jTextArea.append(str + "\n");
    this.jTextArea.setSelectionStart(this.jTextArea.getText().length());
      

  2.   

    表示我也遇到了,应该无解,内部Bug但是我是用JList的时候出现的我用的数据为几万条,中途出现的这个问题
      

  3.   

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.util.concurrent.atomic.AtomicInteger;public class JTextAreaExample {
        public static void main(String[] args) {
            java.awt.EventQueue.invokeLater(new Runnable(){
                    @Override public void run(){
                        final JFrame frame = new JFrame("JTextArea Example");
                        final JTextArea input = new JTextArea();
                        final JScrollPane scroller = new JScrollPane(input);
                        final Timer timer = new Timer(10, new ActionListener(){
                            private final AtomicInteger counter = new AtomicInteger(0);
                            @Override public void actionPerformed(ActionEvent event){
                                if(input.getLineCount() > 2000) input.setText("");
                                input.append(String.format("%s %d%n","Hello", counter.incrementAndGet()));
                            }
                        });
                        frame.add(scroller);
                        frame.setPreferredSize(new Dimension(600,400));
                        frame.pack();
                        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        frame.setVisible(true);
                        frame.addWindowListener(new WindowAdapter(){
                            @Override public void windowOpened(WindowEvent event){
                                timer.start();
                            }
                            @Override public void windowClosing(WindowEvent event){
                                timer.stop();
                            }
                        });
                    }
                });
        }
    }
      

  4.   

    if (this.jTextArea.getLineCount() > 2000) {
    this.jTextArea.setText("");
    }
    this.jTextArea.append(str + "\n");
    this.jTextArea.setSelectionStart(this.jTextArea.getText().length()); 
      

  5.   

    if (this.jTextArea.getLineCount() > 2000) {
    this.jTextArea.setText("");
    }
    this.jTextArea.append(str + "\n");
    this.jTextArea.setSelectionStart(this.jTextArea.getText().length()); 5L 不是给你测试了吗,1w多行都没问题,2000行怎么会有问题呢
      

  6.   

    在EDT中更新组件,耗时的工作使用SwingWorker
      

  7.   

    if (this.jTextArea.getLineCount() > 2000) {
    this.jTextArea.setText("");
    }
    this.jTextArea.append(str + "\n");
    this.jTextArea.setSelectionStart(this.jTextArea.getText().length()); 5L 不是给你测试了吗,1w多行都没问题,2000行怎么会有问题呢
    我的程序同时开着10+个线程类,内容要>>1w,问题的关键在于程序最终导致OOM,引起程序崩溃。我想请教的是,这段程序为什么会导致OOM.
      

  8.   

    之前没用过SwingWorker,能不能说明一下为什么要用这个,谢谢~
      

  9.   

    之前没用过SwingWorker,能不能说明一下为什么要用这个,谢谢~
    在EDT里执行耗时的操作,会让界面响应变慢,甚至失去响应(假死)
      

  10.   

    之前没用过SwingWorker,能不能说明一下为什么要用这个,谢谢~
    在EDT里执行耗时的操作,会让界面响应变慢,甚至失去响应(假死)
    谢谢指教~
    不过我这边出现程序卡死的原因是内存溢出导致的,而不是由于执行耗时任务的操作导致的响应太慢以致假死。
    我只是要用JTextArea实时输出每个线程的执行情况,现在把JTextArea.append("XXX")改成了JTextArea.setText("XXX"),貌似可以解决目前的问题,但是不得问题的要领,郁闷!
      

  11.   

    后来只能用setText了么?jTextArea最大能存多少呢?