Использование памяти с Java JScrollPane - PullRequest
1 голос
/ 16 июля 2011

У меня есть приложение для регистрации данных Java (Swing), записывающее текст в JTextArea внутри JScrollPane. Приложение добавляет текст к JTextArea и соответственно прокручивается вверх. В видимой области только 5 строк текста, и это было бы приемлемо, если бы пользователь мог прокручивать примерно 100 строк назад, но мне кажется, что объем потребляемой памяти будет расти без ограничений. 1004 *

Могу ли я что-нибудь сделать, чтобы ограничить количество оставшихся строк или иным образом ограничить объем используемой памяти?

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

Могу ли я что-нибудь сделать, чтобы ограничить количество оставшихся строк

См .: Ограничение строк в документе .

2 голосов
/ 16 июля 2011

Панель прокрутки не имеет к этому никакого отношения.Вы можете ограничить данные, хранящиеся в PlainDocument, который используется JTextArea.Я думаю, что DocumentFilter мог бы использоваться для этой цели.

Редактировать 1
Вот простая DocumentFilter версия кода camickr (Роб: извините за выходи воровство!).

import javax.swing.text.*;

public class LimitLinesDocumentFilter extends DocumentFilter {
   private int maxLineCount;

   public LimitLinesDocumentFilter(int maxLineCount) {
      this.maxLineCount = maxLineCount;
   }

   @Override
   public void insertString(FilterBypass fb, int offset, String string,
            AttributeSet attr) throws BadLocationException {
      super.insertString(fb, offset, string, attr);

      removeFromStart(fb);
   }

   @Override
   public void replace(FilterBypass fb, int offset, int length, String text,
            AttributeSet attrs) throws BadLocationException {
      super.replace(fb, offset, length, text, attrs);

      removeFromStart(fb);
   }

   private void removeFromStart(FilterBypass fb) {
      Document doc = fb.getDocument();
      Element root = doc.getDefaultRootElement();
      while (root.getElementCount() > maxLineCount) {
         removeLineFromStart(doc, root);
      }
   }

   private void removeLineFromStart(Document document, Element root) {
      Element line = root.getElement(0);
      int end = line.getEndOffset();

      try {
         document.remove(0, end);
      } catch (BadLocationException ble) {
         ble.printStackTrace();
      }
   }

}

И код для проверки:

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();
         }
      });
   }
}
...