Вы можете перехватить изменения CHANGE и обернуть каждый в другой UndoableEdit, чей метод isSignificant()
возвращает false
, прежде чем добавить его в UndoManager. Затем каждая команда отмены будет отменять самое последнее изменение INSERT или REMOVE, а также каждое изменение CHANGE, которое произошло с тех пор.
В конечном счете, я думаю, вы обнаружите, что механизм стилей предоставлен JTextPane / StyledDocument / и т.д. слишком ограничен для такого рода вещей. Он медленный, использует слишком много памяти и основан на том же элементном дереве, которое используется для отслеживания лексической структуры документа. Это нормально (я полагаю) для приложений, в которых стили применяются пользователем, таких как текстовые процессоры, но не для подсветки синтаксиса, которая должна постоянно обновлять стили при вводе пользователем.
Существует несколько примеров редакторов с подсветкой синтаксиса, основанных на пользовательских реализациях классов Swing JTextComponent
, View
и Document
. Некоторые, такие как JEdit, повторно реализуют практически весь пакет javax.swing.text
, но я не думаю, что вам нужно заходить так далеко.