在 DocumentEvent 中获取更改的内容
Get changed content in DocumentEvent
目标:
使用 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();
}
});
}
尽管此解决方案部分有效(有时在删除图像时系统输出报告 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);
}
});
DocumentEvent 有 getOffset() 和 getLength() 方法。通常图像是树叶,因此您可以使用 htmlDocument.getCharacterElement() 从变化范围中检查它们是否是图像。
更新:作为评论中讨论的结果
您可以添加一个 DocumentFilter 覆盖 remove() 并将其用作侦听器以获取已删除的片段(实际上是要删除的片段)。
目标:
使用 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();
}
});
}
尽管此解决方案部分有效(有时在删除图像时系统输出报告 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);
}
});
DocumentEvent 有 getOffset() 和 getLength() 方法。通常图像是树叶,因此您可以使用 htmlDocument.getCharacterElement() 从变化范围中检查它们是否是图像。
更新:作为评论中讨论的结果
您可以添加一个 DocumentFilter 覆盖 remove() 并将其用作侦听器以获取已删除的片段(实际上是要删除的片段)。