【问题标题】:Get changed content in DocumentEvent在 DocumentEvent 中获取更改的内容
【发布时间】:2015-03-21 14:52:56
【问题描述】:

目标:
使用 JEditorPane 和 HTMLDocuments 我需要对图像的删除做出反应,即由<img>..</img> 标签定义的元素。

我尝试了什么:
现在我使用 DocumentListeners 对 DocumentEvents 做出反应,这些事件在文档更改时触发。不幸的是,DocumentEvents 不直接包含有关更改内容的信息,因此我无法确定删除了哪种元素。看来我所能做的就是遍历文档的所有元素并调用事件 getChange(Element)。

document.addDocumentListener(new DocumentListener() {

    @Override
    public void removeUpdate(DocumentEvent arg0) {
        ElementIterator iter = new ElementIterator(document);
        Element element;
        while ((element=iter.next()) != null) {
            ElementChange change = arg0.getChange(element);
            if (change != null) {                   
                Element[] children = change.getChildrenRemoved();
                for (Element child : children) {
                    Object name = child.getAttributes().getAttribute(StyleConstants.NameAttribute);
                    System.out.println((HTML.Tag)name);                     
                    }
                }               
            }
            notifyContentChanged();
        }
    });
}

虽然此解决方案部分有效(有时在删除图像时 sysout 报告 p-implied 而不是 img)我非常感谢其他解决方案。可能有人知道获取与文档更改相关联的String 的简单方法?

解决方案
根据接受的答案,以下代码演示了将 DocumentFilters 用作侦听器(在这种情况下用于图像删除)。

document.setDocumentFilter(new DocumentFilter() {
        @Override
        public void remove(FilterBypass fb, int offset, int length)
                throws BadLocationException {
            if (document.getCharacterElement(offset).getName().equals(HTML.Tag.IMG.toString())) {
                .
                .   
            }
            super.remove(fb, offset, length);
        }
    });

【问题讨论】:

    标签: java jeditorpane documentlistener htmleditorkit htmldocumentclass


    【解决方案1】:

    DocumentEvent 具有 getOffset() 和 getLength() 方法。通常图像是叶子,因此您可以使用 htmlDocument.getCharacterElement() 从变化范围中检查它们是否是图像。

    更新:作为评论中讨论的结果

    您可以添加一个覆盖 remove() 的 DocumentFilter 并将其用作侦听器以获取已删除的片段(实际上是要删除的片段)。

    【讨论】:

    • 不幸的是,这在上述监听器的上下文中没有帮助。 HTMLDocument 的默认实现在对文档执行更改之后调用侦听器。这意味着,从内容字符串test 中删除e,查看偏移量/长度将指向s 而不是e
    • 然后您可以添加一个 DocumentFilter 覆盖 remove() 并将其用作侦听器以获取已删除的片段。
    • 惭愧,最近经常使用 SWT,我似乎变得过于专注于使用现有的 Listener 接口。我已经考虑过使用 DocumentFilters,但没有走这条路,因为它感觉像是一种解决方法,并且对于这样一个基本任务来说过于复杂。事实上,就我而言,它或多或少是一个“单线”。如果您愿意将您的评论建议添加到您的答案中或创建一个新的答案,我很乐意接受这个答案,谢谢。
    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多