我正在尝试使用JTextArea创建一个Chatbox。它将在0处插入一行新文本,以便在TextArea顶部逐行添加文本。
我将使用换行符分隔每一行并进行自动换行,但我无法找到限制一次可见消息数量的方法。因此,如果我将限制设置为100,我将如何制作,以便可以看到超过100条消息?我希望文本自动删除最后一行并插入新行。
我知道如何以编程方式执行此操作,使用字符串ArrayList,它将为每条消息添加一个新String,并删除第一个索引。但这有效吗?我不希望在循环100次并在每次发送的消息超过100时重新打印所有消息时有明显的延迟。
这是我目前的代码。
ArrayList<String> notice = new ArrayList<>();
public void notice(String user, String msg) {
notice.add(user+": "+msg+"\n");
if (notice.size() > 100) {
notice.remove(0);
getFrame().getGameGUI().getChat(0).setText("");
for (String s : notice) {
getFrame().getGameGUI().getChat(0).insert(s,0); //is this ideal with users regularly sending messages?
}
} else
getFrame().getGameGUI().getChat(0).insert(user+": "+msg+"\n",0);
}
FYI,getFrame()。getGameGUI()。getChat(0)用于检索JTextArea&#34; noticeChat&#34;。我在TabbedPane中有多个JTextAreas,所以我使用getChat来检索它们而不是为每个创建一个新函数。
对不起,如果有任何混淆。我的主要问题是:当用户不断向其中插入新的文本行时,更新有限大型JTextArea的理想方法是什么?
答案 0 :(得分:3)
使用DocumentFilter
中显示的Implementing a Document Filter。使用FilterBypass
,您可以获得对文本区域PlainDocument
的引用,并且可以检查根元素返回的行数。然后,当行数超过100时,您可以删除第一行。
答案 1 :(得分:3)
查看Limit Lines in Document以获取使用DocumentFilter
根据需要删除行的解决方案。