Я изо всех сил пытался уложить в голове все, что связано с DocumentFilter, и именно тогда, когда я почувствовал, что понял его в основном, я попробовал простой тестовый пример, который просто не имел никакого смысла.
Таким образом, изначально целью было создать простой DocumentFilter, разрешающий только числа, включая десятичные дроби. Я провел некоторое исследование и прочитал несколько сообщений, уже существующих здесь, на StackOverflow, которые очень хорошо детализируют процесс. Спасибо тем, кто написал в тех. Я также впервые прочитал о Regex и был потрясен его универсальностью.
Двигаясь дальше, я написал (в основном скопировал) один из примеров и попробовал его в своей программе, но по какой-то причине он просто не работал. Я решил вернуться к основам и попробовать очень простой подкласс DocumentFilter:
public class SomeFilter extends DocumentFilter {
public void insertString(FilterBypass fb, int offs, String str,
AttributeSet a) throws BadLocationException {
if (str.matches("B")) super.insertString(fb, offs, str, a);
}
public void replace(FilterBypass fb, int offs, int len, String str,
AttributeSet a) throws BadLocationException {
if (str.matches("A")) super.replace(fb, offs, len, str, a);
}
}
Это то, что действительно сбивает меня с толку сейчас. Из документов оракула я прочитал, что вставкаString предназначена для вставки материала (я предполагаю, где находится курсор), а замена - для замены (например, для копирования и вставки). Теперь ясно, что я что-то неправильно понимаю, потому что JTextField, для которого я использую setDocumentFilter, позволяет мне «вставлять» только A, а не B. Может кто-нибудь объяснить, как на самом деле работают эти методы?
Если я смогу понять это, я позже опубликую то, что у меня было для фактического IntegerFilter, чтобы посмотреть, смогу ли я это сделать.