Текстовые компоненты
При создании приложения с графическим интерфейсом очень часто приходится использовать поля для ввода текста. Такое поле может состоять из одной или нескольких строк, быть редактируемым или не редактируемым. В редактируемом окне часто приходится задавать возможность смены шрифта, цвета, вставку дополнительных символов. Библиотека Swing предоставляет для этого большие возможности, предлагая пакеты интерфейсов и классов javax.swing.text, javax.swing.text.html, j avax. swing.text. html .parser и j avax. swing. text. rtf.
На вершине иерархии текстовых компонентов стоит класс JTextComponent — непосредственное расширение класса JComponent. Это абстрактный класс, вобравший в себя общие свойства всех текстовых компонентов. У него три расширения: однострочное текстовое поле JTextField, многострочная текстовая область JTextArea и небольшой, но мощный текстовый редактор JEditorPane, имеющий расширение- класс JTextPane, ме
тодами которого можно оформить текст в каком-то определенном стиле.
У класса JTextField есть два расширения- поле для ввода пароля JPasswordField, в ко
тором вместо вводимых символов показывается один заранее определенный символ, по умолчанию звездочка, и поле для редактирования форматированных объектов JFormattedTextField, например даты — объекта класса Date, или чисел, заданных в определенном формате.
Рассмотрим текстовые компоненты подробнее и начнем с вершины их иерархии.
Компонент
Абстрактный класс JTextComponent стоит на вершине иерархии текстовых компонентов и содержит их общие свойства.
Текстовые компоненты построены по схеме "Model-View-Controller", которая отражена во внутреннем устройстве класса JTextComponent. Рассмотрим это устройство подробнее. Начнем с модели данных текстовых компонентов.
Модель данных схемы MVC текстовых компонентов описана интерфейсом Document и называется
Если текст документа сложный, структурированный, то, чтобы скрыть сложность определения текущей позиции при частых вставках и удалениях текста, удобно воспользоваться объектом, описанным интерфейсом Position. Экземпляр класса, реализующего интерфейс Position, создается методом createPosition (int). Методы getStartPosition( ) и getEndPosition() возвращают начальную и конечную позиции текста в виде объекта, реализующего интерфейс Position. В интерфейсе Position всего один метод — getOffset (), возвращающий позицию символа в виде целого числа типа int. Кроме того, в интерфейсе Position есть вложенный класс Bias, в котором определены два экземпляра класса Bias: поле Forward и поле Backward. Они уточняют символ, позиция которого определена: текущий или предыдущий. Позиция символа используется, например, при получении текста методами
String getText(int offset, int length);
void getText(int offset, int length, Segment text);
извлекающими из документа фрагмент текста длиной length символов, начиная от позиции offset. Второй метод заносит извлеченный фрагмент в экземпляр text класса Segment. Опишем этот небольшой, но удобный класс.
Строка символов
Класс Segment представляет строку символов в виде, удобном для быстрого просмотра. У строки класса Segment всегда есть текущий символ, который можно получить методом current ( ). Позицию текущего символа можно узнать методом getIndex (), а установить — методом setIndex (int). Класс Segment содержит методы previous () и next (), возвращающие предыдущий и следующий символ строки, а также методы first () и last (), возвращающие первый и последний символ строки. Будьте внимательны: эти четыре метода меняют текущую позицию строки!
Интересно, что для быстроты доступа строка класса Segment хранится в
вращает индекс начала строки в массиве array, т. е. число offset, а getEndIndex( ) индекс элемента массива, следующего за последним символом строки.