JTextArea 显示最后 X 行

JTextArea show last X lines

我想使用 jTextArea 作为我的应用程序的事件日志。我知道我可以重定向 system.out 和 system.in 但我想为代码的不同部分使用多个 jTextArea 日志。例如,我想在 jTextArea 中记录并显示 TCPServer 日志。例如它应该有这样的数据。

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 天我找不到它。也许我现在正在搜索错误或对我的问题提出不好的要求。

保留一个 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"?

这会比您当前的实施更有效。

我认为这就是您所说的监听器:

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

使用简单:

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