2015-03-05 2 views
3

Я хочу использовать jTextArea как журнал событий для своего приложения. Я знаю, что могу перенаправить system.out и system.in, но я хочу использовать несколько журналов jTextArea для разных частей моего кода. Например, я хочу сделать журнал TCPServer и вести журнал для него в jTextArea. Например, у него должны быть такие данные.JTextArea показать последние строки X

2015-01-01 12:00:00 - TCPServer started listening on port 10000 
2015-01-01 12:05:00 - Client with IP 192.168.0.1 connected 
2015-01-01 12:06:00 - Client with IP 192.168.0.2 connected 
2015-01-01 12:05:00 - Client with IP 192.168.0.1 send "Hello server" message 
2015-01-01 12:05:00 - Client with IP 192.168.0.1 disconnected 

Что я хочу показать, это последние строки X, возможно, 100 строк в качестве предела. Старшие строки не должны отображаться. Я знаю, когда добавляю строку 101, я могу прочитать все строки, разделив весь текст из jTextArea на \ n и снова заполнив его строками от 2 до 101, но я ищу лучшее и более эффективное решение.

В прошлом, я думаю, я нашел прослушивателя документов, которые делают это, но последние 3 дня я не смог его найти. Возможно, я сейчас искал это неправильно или плохо спрашиваю о своей проблеме.

ответ

3

Я думаю, что это слушатель, что вы говорите:

https://tips4java.wordpress.com/2008/10/15/limit-lines-in-document/

Это простое в использовании:

textComponent.getDocument().addDocumentListener(
    new LimitLinesDocumentListener(50)); 
+1

Я думаю, что я использовал один и тот же документ слушатель, спасибо человеку, я до сих пор не знаю, почему я не смог найти его в Google. – AdrianES

1

Сохраните файл ArrayDeque<Integer>, чтобы сохранить длины строк, которые вы печатаете на вашем JTextArea: каждый раз, когда вы вставляете строку, если линий меньше N (= независимо от ваших предполагаемых максимумов), просто добавьте их в конец вашей очереди. Если есть уже N строк, используйте

myTextArea.replaceRange("", 0, myQueue.remove()); 

Это заменяет первую строку ничем, эффективно удаляя ее.

Чтобы добавить новую строку, используйте

myQueue.addLast(textToAdd.length()); // maybe +1 to account for endline? 
myTextArea.append(textToAdd);  // may require a "/n"? 

Это было бы гораздо более эффективным, чем текущая реализация.

+0

будет попробовать, спасибо – AdrianES

Смежные вопросы