Как получить добавленные, удаленные или измененные символы из DocumentListener? - PullRequest
2 голосов
/ 04 октября 2009

У меня есть JTextAreas, и мне нужно получить символы, которые добавляются, удаляются или меняются. Как мне это сделать?

Ответы [ 2 ]

1 голос
/ 05 октября 2009

Добавить легко, вы просто используете DocumentListener.

Для обработки добавления и удаления вы можете использовать DocumentFilter. Я считаю, что метод replace () вызывается, когда вы оба добавляете / удаляете текст.

Edit:

DocumentFilter НЕ вызывается при удалении. Таким образом, единственный способ узнать об удалении (кроме хранения дубликата документа) - создать собственный документ и переопределить метод удаления (...). Затем вы можете извлечь строку, прежде чем она будет удалена из документа.

0 голосов
/ 05 октября 2009

Вы можете получить смещение и длину (и даже источник Document), так что символы могут быть прочитаны из этого. Если вы хотите узнать, что представляют собой удаленные символы, вы должны были бы сохранить копию содержимого документа.

Swing-документы должны быть поточно-ориентированными (хе-хе). Но если в других потоках происходят множественные изменения (события всегда запускаются в EDT просто для того, чтобы сделать вещи более увлекательными), тогда данные о персонаже могут быть устаревшими. На самом деле вы ничего не можете с этим поделать. Даже другие слушатели событий могут в итоге косвенно изменить содержимое документа.

Как правило, простой подход к событиям - полностью игнорировать объект события. Все, что вам нужно знать, - это что-то (возможно) изменившееся в объектах, которые вы слушаете. Это должно дать вам надежный и легкий для понимания код. Если вам действительно нужно поработать над изменениями, DocumentFilter, упомянутый camickr, является полезной вещью, добавленной в Swing начиная с swingall.jar (кроме лучшей нативной точности L & F).

(Обратите внимание, что многие люди не могут прочитать документы для DocumentListener.changedUpdate - это относится к изменяющимся атрибутам, а не к символам.)

...