Методы, унаследованные от 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).
Работу с системным
Итак, основные действия с полем ввода легко выполняются без обращения к модели данных — документу, виду или редактору. Для более сложных действий надо получить ссылку на документ методом 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 непосредственно расширяет класс 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){ newDate = (Date)ftf.getValue();
}
Метод getValue() возвращает объект типа Object, полученный в результате обратного преобразования отредактированной в окне строки в первоначальный объект.
Преобразованием объекта в строку и обратно занимается вложенный в JFormattedTextField абстрактный класс AbstractFormatter. Для этого в нем есть методы
valueToString(Object) и stringToValue(String). Эти методы оставлены абстрактными. После их определения следует установить полученный "преобразователь" в редактор методом install (JFormattedTextField) класса AbstractFormatter или воспользоваться конструктором
JFormattedTextField(JFormattedTextField.AbstractFormatter);