Как видите, схема MVC получила в компоненте JTextComponent развитое детальное воплощение. Разработчик при желании может совершенно изменить стандартную реализацию текстовых компонентов. Правда, нужда в этом возникает редко. Чаще всего приходится переопределять метод insertString (), чтобы наложить какие-то ограничения на вводимые символы. Примеры этому будут даны далее.
Как принято в библиотеке Swing, класс JTextComponent дублирует многие методы своей схемы MVC. Большинство действий с текстовым компонентом можно выполнить без непосредственного обращения к
Еще одна возможность, заложенная в класс JtextComponent, — задать раскладку клавиатуры для ввода текста.
Для обеспечения такой возможности при нажатии или отпускании клавиши создается объект класса KeyStroke. Он содержит код клавиши и состояние клавиш-модификаторов
Класс KeyStroke предоставляет "фабричные" методы для создания своих объектов одним из следующих статических методов:
П KeyStroke getKeyStroke(char keyChar) — задается символ keyChar, отвечающий нажатию клавиши;
П KeyStroke getKeyStroke(int keyCode, int modifiers) — задается код клавиши keyCode константой вида vk_* класса KeyEvent и отмечается нажатие клавиш
П Keystroke getKeyStroke(Character keyChar, int modifiers) — символ задается объектом класса Character;
П Keystroke getKeyStroke(int keyCode, int modifiers, boolean onRelease) — последний параметр отмечает, что объект создается при нажатии (false) или отпускании клавиши (true);
П Keystroke getKeyStroke(String keyString) — все параметры записаны в одну строку keyString. Правила записи приведены в документации.
Полученный в результате нажатия или отпускания клавиши объект класса KeyStroke используется затем объектом, реализующим интерфейс Keymap. Этот объект задает реакцию на нажатие клавиши в виде объекта, реализующего интерфейс Action, и хранит набор пар "клавиша- действие" типа "Keystroke-Action". Интерфейс Action описан в
Такой механизм задания реакции на действия с клавиатурой заменяет обычную обработку событий клавиатуры через добавление слушателя к текстовому компоненту.
Новая пара "клавиша — действие" добавляется в набор методом
void addActionForKeyStroke(KeyStroke key, Action a);
Весь набор действий в виде массива типа Action[] можно получить методом
getBoundActions(), а набор объектов KeyStroke[] — методом getBoundKeyStrokes(). Отдельное действие Action возвращается методом getAction(KeyStroke).
Объекты типа Keymap можно связать в цепочку, задав родительский объект методом setResolveParent(Keymap). Если пара "клавиша — действие" не окажется найденной в данном объекте, то она будет отыскиваться в родительском объекте и далее по цепочке.
Библиотека Swing не реализует интерфейс Keymap открытым классом. Вместо этого реализация осуществляется закрытым полем класса JTextComponent. При создании текстового компонента это поле заполняется раскладкой по умолчанию default_keymap. Получить текущую раскладку можно методом getKeymap (), а установить новую — методом setKeymap (Keymap). Добавить новую раскладку в цепочку можно статическим методом
addKeymap(String name, Keymap parent);
Несколько логических методов print () класса JTextComponent вызывают появление на экране стандартного диалогового окна печати, помогающего выбрать принтер и распечатать на нем содержимое компонента. Методы возвращают false, если пользователь отменил печать, щелкнув мышью по кнопке Cancel в диалоговом окне, и true в противном случае.
П print () — печать текста компонента без колонтитулов.
П print(MessageFormat header, MessageFormat footer) — добавляется печать верхнего header и нижнего footer колонтитулов, оформленных как объекты класса
MessageFormat из пакета java.text.
Остальные, более сложные методы печати используют сервер печати, но это выходит за рамки нашей книги.
Поле ввода
Хотя внутреннее строение текстовых компонентов сложно, их обычное использование не представляет никаких трудностей.
Однострочное поле ввода создается одним из конструкторов:
П JTextField(int columns) — пустое поле ввода с окном, размер которого достаточен для размещения columns символов. В поле можно вводить сколько угодно символов, окно будет прокручиваться;
П JTextField (String text) -поле ввода с начальным текстом text;
П JTextField (String text, int columns) -поле ввода с начальным текстом text и шири
ной columns символов;
П JTextField(Document doc, String text, int columns) — задается модель данных doc.
Модель данных можно заменить методом setDocument(Document). Допустимо заменять не всю модель, а только шрифт методом setFont ( Font).