или методом setFormatter(AbstractFormatter) класса JFormattedTextField.
Кроме преобразования объекта, AbstractFormatter определяет еще экземпляр класса
DocumentFilter и Экземпляр класса NavigationFilter, которые можно получить методами
getDocumentFilter( ) и getNavigationFilter(). Это придает редактору объектов вторую роль — проверять и фильтровать вводимый в поле текст, допуская только определенные символы.
В библиотеке Swing есть реализация класса AbstractFormatter — его расширение DefaultFormatter. Для преобразования объекта в строку метод valueToString (Obj ect) в классе DefaultFormatter определен очень просто: он использует метод toString () этого объекта. Метод stringToValue(string) обратного преобразования строки в объект использует конструктор класса с единственным параметром типа String. Если такого конструктора нет, то возвращается строка.
Класс DefaultFormatter применяется редко, он употребляется как базовый класс для полезных расширений. Несколько готовых расширений есть в библиотеке Swing.
От класса DefaultFormatter порождены два класса. Класс MaskFormatter определяет маску ввода, накладывающую ограничения на вводимые значения подобно классу Format и его подклассам из пакета java.text. Например, класс
MaskFormatter mf = new MaskFormatter("###.##");
накладывает маску действительных чисел с двумя знаками после десятичной точки.
Второй класс InternationalFormatter прямо использует класс Format для своих преобразований, который задается в конструкторе
InternationalFormatter(Format);
Он расширен двумя классами: класс NumberFormatter использует класс DecimalFormat для фильтрации чисел, а класс DateFormatter-класс DateFormat для отбора даты и времени.
Для того чтобы облегчить создание классов -преобразователей, в классе
JFormattedTextField есть вложенный абстрактный класс AbstractFormatterFactory, расширенный классом DefaultFormatterFactory. Этот класс содержит несколько методов getXxxFormatter (), возвращающих тот или иной объект-преобразователь.
Область ввода
Класс JTextArea представляет многострочную область ввода с "плоским" текстом, в котором не меняются атрибуты шрифта. Для редактирования сложного текста удобнее использовать JTextEditor или JTextPane.
В область ввода JTextArea не заложена возможность прокрутки большого текста. Если в этом есть необходимость, то область надо поместить в контейнер JScrollPane:
JTextArea ta = new JTextArea(5, 50);
JScrollPane sp = new JScrollPane(ta); container.add(sp);
При этом следует задать размеры области — число строк и столбцов — как это сделано ранее, или предпочтительный размер JScrollPane.
По умолчанию слово, не поместившееся в видимой части строки, не переносится целиком на следующую строку. Эту возможность надо включить методом
setWrapStyleWord(true).
Аналогично, по умолчанию весь текст в области показывается в виде одной строки, выходящей за пределы окна. Если область ввода помещена в контейнер JScrollPane, то появляется горизонтальная линейка прокрутки. Чтобы строки не выходили за пределы окна, надо включить перенос строк методом setLineWrap(true).
Текст в область ввода можно не только занести методом setText(String), но и добавить в конец уже имеющегося текста методом append (String) и вставить программно в определенную позицию методом insert(String, int).
Область ввода допускает изменение размера табуляции методом setTabsize (int).
В остальном область ввода ведет себя как поле ввода класса JTextField.
Текстовый редактор
Текстовый редактор класса JEditorPane по умолчанию распознает три MIME-типа текста: text/plain, text/html и text/rtf, вызывая для изменения редакторы DefaultEditorKit, HTMLEditorKit или RTFEditorKit соответственно. Для того чтобы учесть MIME-тип текста, применяется конструктор
JEditorPane(String type, String text);
Он вызывает метод setContentType (type), задающий MIME-тип текста, а затем — метод
setText(text). Например:
JEditorPane ep= new JEditorPane("text/html;Content-Type=windows-1251",
"^Ш^Документ HTML" );
JScrollPane sp = new JScrollPane(ep); container.add(sp);
Метод setText (String) не меняет выбранный редактор. Поэтому MIME-тип его параметра должен соответствовать имеющемуся редактору. Впрочем, можно установить новый редактор методом setEditor(EditorKit). Следует учитывать, что при этом сменится и документ!
Для определенного MIME-типа методом
setEditorKitForContentType(String type, EditorKit editor);
можно задать редактор, который будет вызываться для обработки текста этого типа.
Еще два конструктора позволяют занести начальный текст в редактор прямо с адреса, заданного в форме URL. Адрес задается объектом класса url или одной из строк:
JEditorPane(URL url);
JEditorPane(String url);
Информацию с адреса URL можно занести в редактор в любое время методом setPage(url) или setPage(string url). Учтите, что при изменении MIME-типа текста поменяется тип документа и редактора. Если занесена страница HTML, то будут установлены модель данных класса HTMLDocument и редактор класса HTMLEditorKit.