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

getSelectedText().

Выделенный в поле текст можно заменить другим текстом content методом

replaceSelection(String 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).

Работу с системным буфером обмена (clipboard) обеспечивают методы cut (), copy (), отправляющие в буфер выделенный участок текста, и метод paste(), вставляющий в поле содержимое буфера.

Итак, основные действия с полем ввода легко выполняются без обращения к модели данных — документу, виду или редактору. Для более сложных действий надо получить ссылку на документ методом getDocument ( ).

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

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

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

public class NumberText extends JFrame{

JTextField tf = new JTextField(5);

JLabel l = new JLabel(,,Вводите цифры:");

NumberText(){ 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);

add(l); add(tf);

setSize(400, 400);

setDefaultCloseOperation(EXIT ON CLOSE); setVisible(true);

}

public static void main(String[] args){ new NumberText();

}

// Фильтр вводимых данных class NumberFilter extends DocumentFilter{

// Переопределяем только один метод public void insertString(FilterBypass fb, int pos,

String text, AttributeSet attr) throws BadLocationException{

try{

Integer.parseInt(text); // Введена цифра? }catch(Exception e){

// Если не цифра, то символ не вводим super.insertString(fb, 0, "", attr); return;

}

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

}

}

}

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

Класс JPasswordField непосредственно расширяет класс JTextField, значит, к нему относится все сказанное ранее. Одно отличие заключается в том, что в этом поле вместо вводимых символов повторяется один символ, по умолчанию — звездочка. Звездочку можно заменить другим символом с помощью метода setEchoChar(char).

Второе отличие заключается в том, что вместо метода getText () для получения текста из поля пароля используется метод getPassword( ), возвращающий массив символов типа char [], а не строку.

<p><strong>Редактор объектов <emphasis>JFormattedTextField</emphasis></strong></p>

Еще одно расширение класса JTextField- класс JFormattedTextField- предназначено

для работы с объектами, содержащими символы, такими как Date, Number. Впрочем, конструктор класса JFormattedTextField(Object) и метод setValue(Object) позволяют включить в редактор любой объект, при этом в окно редактирования будет выведен результат преобразования этого объекта в текстовую строку.

Типичное применение редактора:

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

// . . . . . . . .

// Редактируем дату... Потом нажимаем клавишу

// . . . . . . . .

public void actionPerformed(ActionEvent e){ newDate = (Date)ftf.getValue();

}

Метод getValue() возвращает объект типа Object, полученный в результате обратного преобразования отредактированной в окне строки в первоначальный объект.

Преобразованием объекта в строку и обратно занимается вложенный в JFormattedTextField абстрактный класс AbstractFormatter. Для этого в нем есть методы

valueToString(Object) и stringToValue(String). Эти методы оставлены абстрактными. После их определения следует установить полученный "преобразователь" в редактор методом install (JFormattedTextField) класса AbstractFormatter или воспользоваться конструктором

JFormattedTextField(JFormattedTextField.AbstractFormatter);

Перейти на страницу:

Все книги серии В подлиннике

Похожие книги