Jtextfield, jtextarea, jtextpane

Текстові компоненти мають архітектуру MVC. Модель текстових компонентів представлена ​​досить простим інтерфейсом Document, який дозволяє отримувати інформацію про зміни в документі і зберігається в ньому текст, а також при необхідності змінювати отриманий текст. Вид реалізований в UI-представниках текстових компонентів; але складається він на основі спеціальних об'єктів Element і View, більше відповідають саме текстовим компонентів. Завдяки цим об'єктам можна гнучко налаштовувати і розширювати зовнішній вигляд і структуру текстових компонентів без втручання в складний процес їх кінцевої промальовування. Контролер з'єднаний з видом для обробки подій, як правило, не пов'язаних з клавіатурою, і частково реалізований у вигляді карти клавіатури (keymap). Карта клавіатури дозволяє гнучко, без зміни UI-представника текстового компонента, змінювати реакцію текстового компонента на натискання клавіш.

Посилання на сторінку

Текстове поле JTextField є найпростішим компонентом і найбільш часто зустрічається в призначених для користувача інтерфейсів. Як правило, поле є однорядковим і служить для введення тексту. У бібліотеці Swing є два текстових поля. Перше, представлене класом JTextField. дозволяє вводити однорядковий текст. Друге поле, реалізоване класом JPasswordField і успадковане від поля JTextField. дає можливість організувати введення «закритою» інформації (найчастіше паролів), яка не повинна безпосередньо відображатись на екрані.

Обидва текстових поля JTextField, JPasswordField прості. Робота з ними найчастіше зводиться до завдання кількості відображуваних в поле символів і початкового тексту, якщо такий вимагається. Після чого залишається тільки помістити поле в контейнер і в потрібний момент отримати з нього набраний користувачем текст.

Приклад використання текстових полів JTextField

У прикладі створюється вікно з декількома текстовими полями. Перше поле створюється за допомогою конструктора класу JTextField. якому передається максимальна кількість символів в поле. Для однорядкових текстових полів прокрутка не потрібна, і розмір поля в символах повинен приблизно відповідати обсягу інформації, яку користувач вводить в поле. Друге поле створюється більш функціональним конструктором: йому передатись текст, який буде записаний в поле, і максимальну кількість символів. Далі визначається шрифт і варіант вирівнювання тексту в поле. За замовчуванням текст вирівнюється по лівому краю, в прикладі - по правому краю.

До текстового поля можна приєднати слухача подій ActionListener. Такі слухачі сповіщаються про натискання користувачем спеціальної клавіші, що сигналізує про закінчення введення. Зазвичай це клавіша Enter. Використовувати слухача особливо зручно в разі текстових полів, призначених для введення важливої ​​інформації. Приєднання до поля слухача ActionListener дозволяє прискорити процес роботи з інтерфейсом, позбавляючи користувача від необхідності після закінчення введення даних клацати на підтверджують кнопках подібних кнопці ОК. Крім прямого приєднання до поля слухача ActionListener можна також скористатися методом setAction (), що приєднує до полю об'єкт-команду Action. Застосування цього методу не видаляє вже приєднаних до полю слухачів, всі вони також будуть сповіщена про завершення введення.

У прикладі також використовується поле для введення «закритих» даних JPasswordField. Це поле успадковано від звичайного поля JTextField. З власних методів поля JPasswordField можна згадати лише метод setEchoChar (). службовець для зміни символу-замінника. За умовчанням як такого символу використовується зірочка '*'. Розробники класу JPasswordField не рекомендують застосовувати для отримання введеного в поле значення (пароля) звичайний метод getText (). Справа в тому, що створювана даним методом рядок String може кешуватися (об'єкти String в Java максимально оптимізуються компілятором і віртуальною машиною), і зловмисник зможе викрасти ваш пароль скануванням пам'яті програми. Для отримання даних надається більш безпечний метод getPassword (), який повертає масив символів char, значення якого після перевірки має сенс обнулити і при бажанні викликати збирач сміття. Поле JPasswordField особливим чином копіює дані в буфер обміну - воно перекриває методи cut () і сміттю (), певні в базовому класі JTextComponent, забороняючи копіювати набраний текст в буфер обміну.

Метод setToolTipText () дозволяє для кожного поля встановити спливаючу "підказку". Інтерфейс вікна представлений на наступному скріншоті.

Jtextfield, jtextarea, jtextpane

Після введення значення в верхнє поле була натиснута кнопка , в результаті чого було відкрито діалогове вікно з відображенням введеного тексту.

Властивості текстових полів

Властивості і методи get / set

Визначення символу-замінника для введення закритої інформації. За замовчуванням використовується символ зірочки (*)

Багаторядкове текстове поле JTextArea призначене для введення простого нерозміченого різними атрибутами тексту. На відміну від звичайних полів, що дозволяють вводити тільки один рядок тексту, багаторядкові поля дають користувачеві можливість вводити будь-яку кількість рядків тексту.

Для багаторядкових полів необхідно ставити не тільки ширину (максимальна кількість символів), але і висоту (максимальна кількість рядків). JTextArea слід розміщувати в панелях прокрутки JScrollPane. Розглянемо приклад використання JTextArea.

У прикладі створюється два багаторядкових текстових полів JTextArea. для яких були змінені деякі найбільш часто використовуваних властивості. Перше текстове поле створюється за допомогою конструктора, заполняещего поле текстом і визначає кількість рядків і символів. Слід звернути увагу, що кількість рядків йде в списку параметрів перед кількістю символів. Задаються в конструкторі кількість рядків і символів поля визначають його розмір в контейнері, але не накладають обмежень на обсяг введеного тексту. Для першого поля був змінений шрифт і визначено нестандартне значення для табуляції викликаючи методу setTabSize (). Даний метод дозволяє вказати, яка кількість символів пробілу буде заміщати символ табуляції, що вставляється натисканням клавіші .

Друге текстове поле створюється за допомогою конструктора, якому в якості параметрів передається кількість рядків і символів. Після цього з використанням методу setText () визначається вміст поля і змінюються властивості, що керують процесом перенесення тексту на нові рядки. За замовчуванням текст в поле JTextArea не переноситься на новий рядок. Змінити дану поведінку дозволяє метод setLineWrap (). Метод setWrapStyleWord () змінює стиль перенесення довгих слів на нові рядки. Якщо ви передасте в цей метод значення true, то слова, що не вміщаються в рядку, будуть цілком переноситися на новий рядок. За замовчуванням значення цієї властивості рівне false. Це означає, що текст переноситься, як тільки йому перестає вистачати місця в рядку, незалежно від того, в якому місці слова доводиться робити перенос.

Текстові поля додаються в панель вмісту вікна з використанням смуг прокручування JScrollPane. Необхідно відзначити, що текстове поле JTextArea не має власної рамки. Смуги прокрутки вирішують дану проблему. Інтерфейс вікна представлений на наступному скріншоті.

Jtextfield, jtextarea, jtextpane

Зверніть увагу на різницю реалізації перенесення тексту в двох компонентах JTextArea. Для перенесення тексту в лівому полі доводиться вручну натискати клавішу Enter. а в правому полі перенесення виконується автоматично.

Властивості багаторядкових текстових полів JTextArea

Властивості (і методи get / set)

Отримання довжини тексту, що зберігається в моделі документа.

Для контролю за змінами в текстових полях Swing є подія DocumentEvent і його слухач DocumentListener, який можна приєднати до моделі Document. Подія DocumentEvent виникає кожен раз при зміні тексту документа. В інтерфейсі слухача DocumentListener визначені три методи; кожен з них викликається при певному типі події в документі: видаленні removeUpdate (DocumentEvent e). оновленні changedUpdate (DocumentEvent e) або вставці insertUpdate (DocumentEvent e) тексту.

Приклад використання класу JTextField c модифікованим DocumentListener включений в архів прикладів, розглянутих на сторінці. У прикладі AutoCompleteFieldTest.java виконується підстановка слова в текстове поле за кількома початковим символам.

Курсор текстових компонентів реалізовувати інтерфейсом Caret. Курсор дозволяє програмно змінювати поточну позицію в тексті і управляти виділеним текстом. Для роботи з виділеним текстом в базовому класі JTextComponent є кілька методів, але спочатку виділення тексту знаходиться у веденні текстового курсора.

Курсор має дві основні властивості - його позиція dot і початкова позиція виділеного тексту mark. Позиція курсора показує, куди будуть вставлятися символи.

Курсор, описаний інтерфейсом Caret, підтримує подія ChangeEvent. Приєднавши до курсора слухача ChangeListener, можна отримувати інформацію про всі переміщення курсора. Базовий клас JTextComponent підтримує подія CaretEvent. Воно також запускається при переміщеннях курсора. Але якщо подія ChangeEvent містить тільки джерело події (сам курсор), то подія CaretEvent дозволяє відразу ж дізнатися поточну позицію курсора і початок відліку.

Приклад використання класу курсора Caret включений в архів прикладів, розглянутих на сторінці. У прикладі CaretTest.java демонструється робота з методами курсора setDot (int position), moveDot (int position), setBlinkRate (int freq), getMark () і getDot ().

завантажити приклади

Тексти програм прикладів, розглянутих на сторінці, можна скачати тут (10 Кб).