3

我有 JTextAreas,需要获取添加、删除或更改的字符。我该怎么做呢?

4

4 回答 4

1

添加很简单,您只需使用 DocumentListener。

要处理添加和删除,您可能可以使用 DocumentFilter。我相信当您添加/删除文本时会调用 replace() 方法。

编辑:

DocumentFilter 不会在删除时被调用。因此,了解删除(除了保留重复的 Document)的唯一方法是创建一个自定义 Document 并覆盖 remove(...) 方法。然后,您可以在将字符串从文档中删除之前将其提取出来。

于 2009-10-04T20:00:53.273 回答
1
@Override
public void insertUpdate(DocumentEvent e) {
    Document document = e.getDocument();

    int offset = e.getOffset();
    int length = e.getLength();

    try {
        String changedTxt = document .getText(offset, length);
    } catch (BadLocationException ex) {
        Logger.getLogger(EditorListener.class.getName()).log(Level.SEVERE, null, ex);
    }
}
于 2020-03-02T12:45:28.067 回答
0

您可以获得偏移量和长度(甚至是 source Document),因此可以从中读取字符。如果您想查看删除的字符是什么,您必须保留文档内容的副本。

Swing 文档应该是线程安全的(呵呵)。但是如果在其他线程中发生了多项更改(事件总是在 EDT 上触发只是为了让事情变得更有趣),那么角色数据可能不是最新的。对此你无能为力。甚至其他事件侦听器也可能最终间接更改文档内容。

通常,使用事件的简单方法是完全忽略事件对象。您需要知道的只是您正在收听的对象(可能已经)发生了一些变化。这应该为您提供健壮且更易于理解的代码。如果您真的需要进行更改,DocumentFiltercamickr 提到的是自 swingall.jar 以来添加到 Swing 的有用的东西(除了更好的本地 L&F 保真度)。

(注意,许多人没有阅读 DocumentListener.changedUpdate 的文档——它适用于属性更改,而不是字符。)

于 2009-10-04T20:14:26.620 回答
0
textArea.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void insertUpdate(DocumentEvent e) {
            try {
                int length=textArea.getText().length();
                char lastCharacter=e.getDocument().getText(length-1,length)).charAt(0);

            } catch (BadLocationException e1) {
                logger.error(e1.getMessage());
            }
        }

        @Override
        public void removeUpdate(DocumentEvent e) {

        }

        @Override
        public void changedUpdate(DocumentEvent e) {

        }
    });
于 2019-12-04T08:39:15.487 回答