Предположим, у меня есть JEditorPane в JPanel. Я хочу иметь возможность выполнять обратный вызов каждый раз, когда пользователь вводит/вставляет текст в компонент JEditorPane. Какой тип слушателя я должен создать?
Для какого события JEditorPane следует создать прослушиватель?
Ответы (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());
Вы можете использовать DocumentListener, чтобы получать уведомления о любых изменениях в документе.
Поскольку я пока не могу оставлять комментарии, я просто хотел бы сказать, что лучше использовать прослушиватели, когда это возможно, чем переопределять класс, как в приведенном выше примере, который переопределяет PlainDocument.
Подход слушателя будет работать с JTextField, JTextArea, JEditorPane или JTextPane. По умолчанию панель редактора использует HTMLDocument, а JTextPane использует StyledDocument. Таким образом, вы теряете функциональность, заставляя компонент использовать PlainDocument.
Если вас беспокоит редактирование текста перед его добавлением в документ, вам следует использовать Фильтр документов
DocumentEvent
, передаваемого вместе с каждым методом слушателя: здесь вы найдете тип изменения, а также смещение в документе, где началось изменение, которые вместе с продолжительностью изменения говорят вам о затронутая часть документа. Механизм обработки событий гарантирует, что эти значения по-прежнему верны (т. е. документ не изменится еще больше), пока выполняются методы прослушивателя.
- person Thomas; 26.03.2010
JEditorPane
, когда пользователь впервые открывает приложение, и мне также нужно иметь возможность иметь HTML в JEditorPane
в какой-то более поздний неуказанный время.
- person Tech Expert Wizard; 02.12.2020
В интерфейсе DocumentEvent вы есть такие методы, как getOffset() и getLength(), которые можно использовать для получения фактических изменений.
Надеюсь, это поможет вам