Получить измененный контент в 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();
}
});
}
Хотя это решение работает частично (иногда при удалении изображения 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 ответ
DocumentEvent имеет методы getOffset() и getLength(). Обычно изображения являются листьями, поэтому вы можете использовать htmlDocument.getCharacterElement() из диапазона изменений и проверить, являются ли они изображениями.
ОБНОВЛЕНИЕ: как результат обсуждения в комментах
Вы можете добавить DocumentFilter, переопределяющий метод remove (), и использовать его в качестве прослушивателя для получения удаленного фрагмента (фактически фрагмента, подлежащего удалению).