Java Swing - не единственный API, который имеет такое поведение в стандартном менеджере отмены. Иногда XUL (который является основой для Firefox и Thunderbird) делает то же самое с текстовыми областями в сторонних расширениях. По сути, даже если исходный текст и текст замены в этом случае похожи, текстовая область должна обрабатывать документ как совершенно новый, как если бы вы сделали , выделив все и Вставьте , чтобы перезаписать старый текст. Как правило, восстановление той же позиции курсора для нового документа было бы бесполезным, а если документ короче, это может быть даже невозможно.
Я думаю, что самым простым способом было бы создать свои собственные действия для замены текста. Слушайте их и выполняйте действия вместо выполнения действий по умолчанию. Ваше настраиваемое действие должно быть составным действием, которое сканирует документ вручную, заменяя подстроки в существующем документе - сканирует и заменяет полностью до конца, выполняя ряд изменений документа. Когда вы переопределяете метод отмены, просто просмотрите список внесенных вами изменений, отменяя каждое в обратном порядке. Пока каждое действие в составном действии правильно устанавливает текст и позицию курсора и его метод отмены работает должным образом, все составное действие также будет отменяться правильно.
В этом руководстве следует надеяться, что эта концепция будет объяснена немного яснее. Пример объединяет действия в группы, пока пользователь печатает. Вам просто нужно сделать то же самое, но с процедурными правками.