Получить измененный контент в 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 (), и использовать его в качестве прослушивателя для получения удаленного фрагмента (фактически фрагмента, подлежащего удалению).

Другие вопросы по тегам