在DocumentEvent中获取更改的内容

时间:2015-01-22 17:34:31

标签: java jeditorpane documentlistener htmleditorkit htmldocumentclass

目标:
使用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);
        }
    });

1 个答案:

答案 0 :(得分:0)

DocumentEvent有getOffset()和getLength()方法。通常图像是叶子,因此您可以使用更改范围内的htmlDocument.getCharacterElement()并检查它们是否为图像。

更新:作为讨论的结果

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