JTextArea自动更新和文本限制

时间:2014-10-14 15:09:14

标签: java swing text chat jtextarea

我正在尝试使用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的理想方法是什么?

2 个答案:

答案 0 :(得分:3)

使用DocumentFilter中显示的Implementing a Document Filter。使用FilterBypass,您可以获得对文本区域PlainDocument的引用,并且可以检查根元素返回的行数。然后,当行数超过100时,您可以删除第一行。

答案 1 :(得分:3)

查看Limit Lines in Document以获取使用DocumentFilter根据需要删除行的解决方案。