【问题标题】:How to store the content of a JTextArea into a class?如何将 JTextArea 的内容存储到一个类中?
【发布时间】:2017-03-30 23:00:19
【问题描述】:

我正在开发一个用作假设电子邮件系统的程序,在该系统中可以创建用户并将消息发送给已创建的其他用户。

消息将存储在“消息”类中,文本在 GUI 的 JTextArea 中键入。我想知道的是我将如何在 Message 类中以完全相同的布局(缩进和所有)存储输入到 JTextArea 中的文本。我考虑过文本文件,但是每条消息都必须有一个,可能会创建无限数量的文本文件,而且我不喜欢必须建立一个系统来为每个文本文件提供唯一名称的概念。

你能给我一些建议吗?

【问题讨论】:

  • getText 有问题还是我在问题中遗漏了什么
  • @MadProgrammer,这让我轻笑着摇头。完全错过了我自己
  • "I thought about text files but then there would have to be one for each message, potentially creating an infinite number of them" -- 为什么要重新发明轮子?专家们早就回答了这类问题——使用数据库。
  • 我相信JComponent 实现了Serializable,你为什么不检查一下序列化是否可以工作? @MadProgrammer 我认为问题在于 OP 除了文本之外还希望保存 JTextArea 的其他属性,例如格式。
  • @ostrichofevil 所以,只需使用getText - 它将以与JTextArea 中出现的相同格式返回文本:P

标签: java swing jtextarea


【解决方案1】:

只需实现DocumentListener interface,然后执行以下操作:

JTextArea someMessage = new JTextArea();
someMessage.getDocument().addDocumentListener(new MyDocumentListener());
someMessage.getDocument().putProperty("name", "Text Area");

这里,我们假设你实现的监听器的名字叫MyDocumentListener,实现可以很简单:

class MyDocumentListener implements DocumentListener {
    String newline = "\n";
 
    @Override
    public void insertUpdate(DocumentEvent e) {
        updateLog(e, "inserted into");
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        updateLog(e, "removed from");
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        //Plain text components do not fire these events
    }

    public void updateLog(DocumentEvent e, String action) {
        Document doc = (Document)e.getDocument();
        int changeLength = e.getLength();
        displayArea.append(
            changeLength + " character" +
            ((changeLength == 1) ? " " : "s ") +
            action + doc.getProperty("name") + "." + newline +
            "  Text length = " + doc.getLength() + newline);
    }
}

示例取自 Oracle website。我建议阅读该文章的其余部分,因为它深入探讨了如何有效地侦听内部文档模型的更新。

如何获取插入的文本

insertUpdate 会在 new 文本输入到 textarea 时通知您。您可以通过拨打DocumentEvent#getOffsetDocumentEvent#getLength 来获取新插入的文本。使用这两种方法,您可以获得插入发生的文档中的偏移量(索引),以及更改的长度。 然后要获取插入的实际文本,请调用 DocumentEvent#getDocument#getText 并提供从事件中获得的偏移量和长度。

如何获取textarea中的所有文本

您可以使用类似的方法来获取文档中的整个文本,即使用Document#getStartPositionDocument#getEndPosition,然后调用Document#getText

或者更简单,JTextArea#getText

【讨论】:

  • 这很好,但我感到困惑的是 getDocument() 是如何工作的。比如,我如何存储由 MyDocumentListener() 解释的内容?
  • @PCRevolt getDocument 返回文本区域的内部文档模型。这是跟踪文本区域内文本的数据结构
  • 我想说的是,这一切似乎都存储在 JTextArea 中。但我想将内容存储在我创建的名为 Message 的类中。我想我可以在 Message 的每个实例中存储一个 JTextArea,但我注意到 getDocument() 返回一个 Document(直到现在我才听说过)。有没有办法将文档添加到 JTextArea?我正在尝试确定如何将 Document 的内容复制到不同的 JTextArea。
  • @PCRevolt,我只是描述了其中一种方式。阅读这些链接,您将很好地跟踪 Textarea 中的每一个变化
  • @PCRevolt,如果你不会使用swing,我会推荐Javafx,因为这种问题只是在JavaFx中做myCustomData.textProperty().bind(myTextarea.textProperty())的问题。 JavaFx 与摇摆编程有很大不同,所以只有在没有时间限制的情况下才切换
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 2021-09-28
  • 2013-03-23
  • 1970-01-01
相关资源
最近更新 更多