Поле введення jtextfield

 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).

Методи, успадковані від JTextComponent. дозволяють занести текст в поле введення методом setText (String). отримати весь текст методом getText (). частина тексту методом getText (int offset, int length) або тільки виділену частину тексту методом

Виділений в поле текст можна замінити іншим текстом content методом

За замовчуванням текст в поле притискається вліво. Змінити це правило можна методом

setHorizontalAlignment (int). задавши в ньому одну з констант: LEFT. CENTER. RIGHT. LEADING. TRAILING класу JTextField.

За замовчуванням текст в поле можна редагувати, але дозволяється створювати поле тільки для читання успадкованим методом setEditable (false).

В поле можна встановити новий курсор методом setCaret (Caret). Допускається просто змінювати колір курсора методом setCaretColor (Color). Позицію курсору можна відстежити методом getCaretPosition (). а задати програмно - методом setCaretPosition (int). Перемістити курсор програмно, виділивши таким способом фрагмент тексту, можна методом moveCaretPosition (int).

Межі виділеної ділянки повертають методи getSelectionStart () і getSelectionEnd (),

а встановлюють - методи setSelectionStart (int) і setSelectionEnd (int).

Колір виділеного тексту можна задати методом setSelectedTextColor (Color). а колір фону виділеного тексту - методом setSelectionColor (Color).

У лістингу 12.1 наведено приклад текстового поля для введення одних тільки цифр.

Лістинг 12.1. Поле введення цифр

import java.awt. *; import javax.swing. *;

public class NumberText extends JFrame

JLabel l = new JLabel ( "Введіть цифри:");

super ( "text"); setLayout (new FlowLayout ());

// Вставляємо фільтр символів, що вводять

((PlainDocument) tf.getDocument ()). setDocumentFilter (new NumberFilter ());

// Текст буде виділятися тільки червоним кольором tf.setSelectedTextColor (Color.red);

// При виділенні тексту фон залишиться білим tf.setSelectionColor (Color.white);

// Курсор буде червоним tf.setCaretColor (Color.red); l.setLabelFor (tf);

setSize (400, 400); setDefaultCloseOperation (EXIT_ON_CLOSE); setVisible (true);

public static void main (String [] args)

// Фільтр вводяться

class NumberFilter extends DocumentFilter

// переобумовленої тільки один метод

public void insertString (FilterBypass fb, int pos, String text, AttributeSet attr)

Integer.parseInt (text); // Введена цифра?

// Якщо не цифра, то символ не запроваджуємо super.insertString (fb, 0, "", attr); return;

// Якщо введена цифра, то заносимо її в поле super.insertString (fb, pos, text, attr);

Поле введення пароля JPasswordField

Клас JPasswordField безпосередньо розширює клас JTextField. значить, до нього відноситься все сказане раніше. Одна відмінність полягає в тому, що в цьому полі замість символів, що вводять повторюється один символ, за замовчуванням - зірочка. Зірочку можна замінити іншим символом за допомогою методу setEchoChar (char).

Друга відмінність полягає в тому, що замість методу getText () для отримання тексту з поля пароля використовується метод getPassword (). повертає масив символів типу char []. а не рядок.

Ще одне розширення класу JTextField - клас JFormattedTextField - призначене для роботи з об'єктами, що містять символи, такими як Date. Number. Втім, кон-

структор класу JFormattedTextField (Object) і метод setValue (Object) дозволяють вклю-

JFormattedTextField ftf = new JFormattedTextField (new Date ()); ftf.addActionListener (this);

// Редагуємо дату. Потім натискаємо клавішу

public void actionPerformed (ActionEvent e)

Метод getValue () повертає об'єкт типу Object. отриманий в результаті зворотного перетворення відредагованого у вікні рядка в початковий об'єкт.

Перетворенням об'єкта в рядок і назад займається вкладений в JFormattedTextField абстрактний клас AbstractFormatter. Для цього в ньому є методи

valueToString (Object) і stringToValue (String). Ці методи залишені абстрактними. по-

тодом install (JFormattedTextField) класу AbstractFormatter або скористатися конст-

або методом setFormatter (AbstractFormatter) класу JFormattedTextField.

Крім перетворення об'єкта, AbstractFormatter визначає ще екземпляр класу DocumentFilter і екземпляр класу NavigationFilter. які можна отримати методами

роль - перевіряти і фільтрувати вводиться в поле текст, допускаючи лише певні символи.

У бібліотеці Swing є реалізація класу AbstractFormatter - його розширення

DefaultFormatter. Для перетворення об'єкту в рядок метод valueToString (Object) в

Схожі статті