Для какого события JEditorPane следует создать прослушиватель?

Предположим, у меня есть JEditorPane в JPanel. Я хочу иметь возможность выполнять обратный вызов каждый раз, когда пользователь вводит/вставляет текст в компонент JEditorPane. Какой тип слушателя я должен создать?


person Geo    schedule 04.07.2009    source источник


Ответы (3)


Один из способов сделать это — создать собственный документ и переопределить метод insertString. Например:

class CustomDocument extends PlainDocument {
    @Override
    public void insertString(int offset, String string, AttributeSet attributeSet)
            throws BadLocationException {
        // Do something here
        super.insertString(offset, string, attributeSet);
    }
}

Это позволяет вам узнать, что вставлено, и при желании наложить на это вето (не вызывая super.insertString). Вы можете применить этот документ, используя это:

editorPane.setDocument(new CustomDocument());
person Russ Hayward    schedule 04.07.2009

Вы можете использовать DocumentListener, чтобы получать уведомления о любых изменениях в документе.

Поскольку я пока не могу оставлять комментарии, я просто хотел бы сказать, что лучше использовать прослушиватели, когда это возможно, чем переопределять класс, как в приведенном выше примере, который переопределяет PlainDocument.

Подход слушателя будет работать с JTextField, JTextArea, JEditorPane или JTextPane. По умолчанию панель редактора использует HTMLDocument, а JTextPane использует StyledDocument. Таким образом, вы теряете функциональность, заставляя компонент использовать PlainDocument.

Если вас беспокоит редактирование текста перед его добавлением в документ, вам следует использовать Фильтр документов

person camickr    schedule 04.07.2009
comment
но как я могу получить фактическое изменение? - person Geo; 04.07.2009
comment
Вы получаете всю необходимую информацию из DocumentEvent, передаваемого вместе с каждым методом слушателя: здесь вы найдете тип изменения, а также смещение в документе, где началось изменение, которые вместе с продолжительностью изменения говорят вам о затронутая часть документа. Механизм обработки событий гарантирует, что эти значения по-прежнему верны (т. е. документ не изменится еще больше), пока выполняются методы прослушивателя. - person Thomas; 26.03.2010
comment
Это лучшее решение, чем принятый ответ для меня, так как мне нужно иметь простой текст в JEditorPane, когда пользователь впервые открывает приложение, и мне также нужно иметь возможность иметь HTML в JEditorPane в какой-то более поздний неуказанный время. - person Tech Expert Wizard; 02.12.2020

В интерфейсе DocumentEvent вы есть такие методы, как getOffset() и getLength(), которые можно использовать для получения фактических изменений.

Надеюсь, это поможет вам

person John Doe    schedule 04.07.2009