Я пытаюсь Закрепление UndoableEditListener
к JTextPane
или JTextArea
, что очередей на изменения в UndoManager
.UndoableEditListener никогда не называли в JTextPane/JTextArea
textPane.getDocument().addUndoableEditListener(new UndoableEditListener() {
@Override
public void undoableEditHappened(UndoableEditEvent event) {
undoQueue.addEdit(event.getEdit());
}
});
Но undoableEditHappened
никогда не вызывается, когда я типа «ааа» в текстовом окне.
Подумайте, что это ошибка Java, а не моя, я раскошу AbstractDocument.class
откройте отладчик Eclipse, чтобы посмотреть триггер события. Он имеет собственный массив listeners
. AbstractDocument
хранит все слушатели в нечетных индексах в массиве listeners
, причем тип слушателей класса <> имеет четные индексы.
protected void fireUndoableEditUpdate(UndoableEditEvent e) {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == UndoableEditListener.class) {
// Lazily create the event:
// if (e == null)
// e = new ListSelectionEvent(this, firstIndex, lastIndex);
((UndoableEditListener) listeners[i + 1]).undoableEditHappened(e);
}
}
}
См. Строку if (listeners[i] == UndoableEditListener.class)
? Когда я добавляю слушателя отмены отмены, отладчик показывает listeners
, содержащий мой слушатель, вместе с UndoableEditListener.class
в индексе перед ним. Но, когда отладчик приходит к этому if-statement, все четные индексы в массиве listeners
отображаются как DocumentListener.class
в отладчике. Следовательно, if-statement всегда false
, и слушатель никогда не звонил.
Что, черт возьми? Является ли это ошибкой Java 8? Или я пропустил какой-то шаг, о котором забыли упомянуть примеры?
Вы пробовали демонстрационный код, найденный в разделе [Реализация Undo/Redo] (http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#undo) учебника Swing? Код отлично подходит для меня, используя JDK7 в Windows 7. – camickr
Чтобы лучше помочь, опубликуйте [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверенный пример) или [SSCCE] (http://www.sscce.org/) (Short, Self Contained, Correct Example). –
Я начал с демо-кода, и, конечно же, это сработало. Спасибо за это предложение. Это заставило меня заметить, что я настроил свою JTextPane. –