2015-02-19 3 views
0

Я пытаюсь Закрепление 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? Или я пропустил какой-то шаг, о котором забыли упомянуть примеры?

+1

Вы пробовали демонстрационный код, найденный в разделе [Реализация Undo/Redo] (http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#undo) учебника Swing? Код отлично подходит для меня, используя JDK7 в Windows 7. – camickr

+1

Чтобы лучше помочь, опубликуйте [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверенный пример) или [SSCCE] (http://www.sscce.org/) (Short, Self Contained, Correct Example). –

+0

Я начал с демо-кода, и, конечно же, это сработало. Спасибо за это предложение. Это заставило меня заметить, что я настроил свою JTextPane. –

ответ

0

Проблема была в JTextPane. Я переопределял его метод setText, чтобы заставить его вызвать read, альтернативу setText, который нормализует все виды новой строки при их запоминании. Но JTextPane.read, похоже, не вызывает UndoableEditEvent на документе.

Если я оставлю setText, то UndoManager.undo работ.

Смежные вопросы