【问题标题】:JTextArea auto-update and text LimitJTextArea 自动更新和文本限制
【发布时间】:2014-12-09 10:45:45
【问题描述】:

我正在尝试使用 JTextArea 制作一个聊天框。它将在 0 处插入新的文本行,将文本逐行添加到 TextArea 的顶部。

我将用换行符分隔每一行并设置自动换行,但我无法找到一种方法来限制一次可见的消息数量。因此,如果我将限制设置为 100,我将如何使其显示的消息不能超过 100 条?我希望文本自动擦除最后一行并插入新行。

我知道如何以编程方式执行此操作,使用字符串的 ArrayList 将为每条消息添加一个新字符串,并删除第一个索引。但这有效吗?我不希望在循环 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);
 }

仅供参考,getFrame().getGameGUI().getChat(0) 用于检索 JTextArea “noticeChat”。我在 TabbedPane 中有多个 JTextArea,因此我使用 getChat 来检索它们,而不是为每个 JTextArea 创建一个新函数。

抱歉,如果有任何混淆。我的主要问题是:当用户不断向其中插入新的文本行时,更新有限的大型 JTextArea 的理想方法是什么?

【问题讨论】:

  • 您在这里似乎有很多问题。您能否(重新)说明您的问题以回复此问题,以便我/我们知道您想要回答什么?
  • 为文本区域编写自己的文档,在插入时提供一些额外的内容(例如删除以前的消息)
  • 基本上,我想知道我更新 JTextArea 的方法是否有效。如果没有,什么是做我正在寻找的好方法?同样,我只是试图让 TextArea 删除底部消息,并在达到其限制(例如 100)时将新消息插入顶部。我的方法是一个数组列表,它将循环并插入每个字符串,但是当用户输入消息时不断重新插入 100 条消息,我想知道效率。 Sergiy,如果不创建新文档,我的示例代码是否不够?
  • 考虑使用 JList 而不是 JTextArea。然后你可以简单地删除列表中的一个项目。

标签: java swing text chat jtextarea


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 2016-05-09
      • 2012-08-22
      • 2012-08-03
      相关资源
      最近更新 更多