Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Используя Компоненты Swing
Раздел: Как Использовать Различные Компоненты
Как Использовать Отформатированные Текстовые поля
Домашняя страница > Создание GUI С JFC/Swing > Используя Компоненты Swing

Как Использовать Отформатированные Текстовые поля

Отформатированные текстовые поля обеспечивают способ для разработчиков определить допустимый набор символов, которые могут быть введены в текстовом поле. Определенно, JFormattedTextField class добавляет средство форматирования и объектное значение к функциям, наследованным от JTextField class. Средство форматирования преобразовывает значение поля в текст, который это выводит на экран, и текст в значение поля.

Используя средства форматирования, которые обеспечивает Swing, можно установить отформатированные текстовые поля, чтобы ввести даты и числа в локализованных форматах. Другой вид средства форматирования позволяет Вам использовать символьную маску, чтобы определить набор символов, которые могут быть введены в каждой позиции в поле. Например, можно определить маску для того, чтобы ввести номера телефона в определенном формате, такой как (XX) X-XX-XX-XX-XX.

Если у возможных значений отформатированного текстового поля есть очевидный порядок, используйте прядильщика вместо этого. Прядильщик использует отформатированное текстовое поле по умолчанию, но добавляет две кнопки, которые позволяют пользователю выбрать значение в последовательности.

Другая альтернатива или дополнение к использованию отформатированного текстового поля устанавливают входной верификатор на поле. Входной верификатор компонента вызывают, когда компонент почти теряет клавиатурный фокус. Входной верификатор позволяет Вам проверить, допустимо ли значение компонента, и дополнительно измените это или мешайте фокусу быть переданными.

Этот GUI использует отформатированные текстовые поля, чтобы вывести на экран числа в четырех различных форматах.

Снимок FormattedTextFieldDemo

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, FormattedTextFieldDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает Приложение FormattedTextFieldDemo
  2. Эксперимент с различным количеством ссуды, годовые процентные ставки (APR), и длины ссуды.
    Отметьте, что, пока текст, который Вы вводите, допустим, поле Month Payment обновляется, когда Вы нажимаете, Вводят или перемещают фокус из поля, которое Вы редактируете.
  3. Введите недопустимый текст, такой как "abcd" в поле Loan Amount и затем нажмите, Входят.
    Поле Month Payment остается тем же самым. Когда Вы перемещаете фокус от поля Loan Amount, текст возвращается к последнему допустимому значению поля.
  4. Введите незначительно допустимый текст такой, поскольку "2000abcd" в поле Loan Amount и нажатии Входят.
    Поле Payment The Monthly обновляется, хотя поле Loan Amount все еще выводит на экран 2000abcd. Когда Вы перемещаете фокус от поля Loan Amount, текст, который это выводит на экран, обновляется к аккуратно отформатированной версии его значения, например, "2 000".

Можно найти весь код для этой программы в FormattedTextFieldDemo.java. Этот код создает первое поле.

amountField = new JFormattedTextField(amountFormat);
amountField.setValue(new Double(amount));
amountField.setColumns(10);
amountField.addPropertyChangeListener("value", this);
...
amountFormat = NumberFormat.getNumberInstance();

Конструктор имел обыкновение создавать amountField объект берет a java.text.Format параметр. Format объект используется средством форматирования поля, чтобы преобразовать значение поля в текст и текст к значению поля.

Остающиеся кодовые наборы amountField объект. setValue метод устанавливает свойство значения поля в число с плавающей точкой, представленное как a Double объект. setColumns метод, наследованный от JTextField class, подсказки о привилегированном размере поля. Звонок addPropertyChangeListener метод регистрирует слушателя для свойства значения поля, таким образом, программа может обновить поле Monthly Payment всякий раз, когда пользователь изменяет количество ссуды.

Остальная часть этого раздела затрагивает следующие темы:

Этот раздел не объясняет API, наследованный от JTextField class. Тот API описывается в том, Как Использовать Текстовые поля.

Создание и Инициализация Отформатированных Текстовых полей

Следующий код создает и инициализирует оставление тремя полями в FormattedTextFieldDemo пример.

rateField = new JFormattedTextField(percentFormat);
rateField.setValue(new Double(rate));
rateField.setColumns(10);
rateField.addPropertyChangeListener("value", this);

numPeriodsField = new JFormattedTextField();
numPeriodsField.setValue(new Integer(numPeriods));
numPeriodsField.setColumns(10);
numPeriodsField.addPropertyChangeListener("value", this);

paymentField = new JFormattedTextField(paymentFormat);
paymentField.setValue(new Double(payment));
paymentField.setColumns(10);
paymentField.setEditable(false);
paymentField.setForeground(Color.red);

...
percentFormat = NumberFormat.getNumberInstance();
percentFormat.setMinimumFractionDigits(2);

paymentFormat = NumberFormat.getCurrencyInstance();

Код для того, чтобы установить rateField объект почти идентичен коду, перечисленному ранее для других полей. Единственная разница - то, что формат немного отличается благодаря коду percentFormat.setMinimumFractionDigits(2).

Код, который создает numPeriodsField объект явно не устанавливает формат или средство форматирования. Вместо этого это устанавливает значение в Integer и позволяет полю использовать средство форматирования значения по умолчанию для Integer объекты. Код не делал этого в предыдущих двух полях, потому что средство форматирования значения по умолчанию не используется для Double объекты. Результат не состоял в том тем, что было необходимо. Как определить, что форматы и средства форматирования покрываются позже в этом разделе.

Платежное поле отличается от других полей, потому что это недоступно для редактирования, использует различный цвет для своего текста, и не имеет слушателя изменения свойства. Иначе, это идентично другим полям. Мы, возможно, хотели использовать текстовое поле или метку вместо этого. Безотносительно компонента мы могли все еще использовать paymentFormat метод, чтобы проанализировать оплату составляет в текст, который будет выведен на экран.

Установка и Получение Значения Поля

Помните следующее при использовании отформатированного текстового поля:


Текст отформатированного текстового поля и его значение являются двумя различными свойствами, и значение часто отстает от текста.


Текстовое свойство определяется JTextField class. Это свойство всегда отражает то, что выводит на экран поле. Свойство значения, определенное JFormattedTextField class, не мог бы отразить последний текст, выведенный на экран в поле. В то время как пользователь вводит, текстовые изменения свойства, но свойство значения не изменяется, пока изменения не фиксируются.

Чтобы быть более точным, значение отформатированного текстового поля может быть установлено при использовании любого setValue метод или commitEdit метод. setValue метод устанавливает значение в указанный параметр. Параметр может технически быть любым Object, но средство форматирования должно быть в состоянии преобразовать это в строку. Иначе, текстовое поле не выводит на экран независимой информации.

commitEdit метод устанавливает значение в любой объект, который определяет средство форматирования, представляется текстом поля. commitEdit метод автоматически вызывают, когда любое из следующего происходит:


Отметьте: 

Некоторые средства форматирования могли бы постоянно обновлять значение, представляя потерю бессмысленного фокуса, поскольку значение всегда является тем же самым как, что определяет текст.


Когда Вы устанавливаете значение отформатированного текстового поля, текст поля обновляется, чтобы отразить значение. Точно, как значение представляется, поскольку текст зависит от средства форматирования поля.

Отметьте это хотя JFormattedTextField class наследовался setText метод от JTextField class, Вы обычно не вызываете setText метод на отформатированном текстовом поле. Если Вы делаете, дисплей поля изменяется соответственно, но значение не обновляется (если средство форматирования поля постоянно не обновляет это).

Чтобы получить текущую стоимость отформатированного текстового поля, используйте getValue метод. В случае необходимости можно гарантировать, что значение отражает текст, вызывая commitEdit метод прежде getValue. Поскольку getValue метод возвращается Object, Вы должны бросить это к типу, используемому для значения Вашего поля. Например:

Date enteredDate = (Date)dateField.getValue();

Чтобы обнаружить изменения в значении отформатированного текстового поля, можно зарегистрироваться, свойство изменяют слушателя на отформатированном текстовом поле, чтобы прислушаться к изменениям к свойству "значения". Слушатель изменения свойства берется от FormattedTextFieldDemo пример:

//The property change listener is registered on each
//field using code like this:
//    someField.addPropertyChangeListener("value", this);

/** Called when a field's "value" property changes. */
public void propertyChange(PropertyChangeEvent e) {
    Object source = e.getSource();
    if (source == amountField) {
        amount = ((Number)amountField.getValue()).doubleValue();
    } else if (source == rateField) {
        rate = ((Number)rateField.getValue()).doubleValue();
    } else if (source == numPeriodsField) {
        numPeriods = ((Number)numPeriodsField.getValue()).intValue();
    }

    double payment = computePayment(amount, rate, numPeriods);
    paymentField.setValue(new Double(payment));
}

Определение Форматов

Format class обеспечивает способ отформатировать уязвимую информацию локали, такую как даты и числа. Средства форматирования, которые убывают от InternationalFormatter class, такой как DateFormatter и NumberFormatter классы, использовать Format объекты преобразовать между текстом поля и значением. Можно получить a Format объект, призывая один из методов фабрики DateFormat или NumberFormat классы, или при использовании одного из SimpleDateFormat конструкторы.


Отметьте: 

Одна треть обычно используемое средство форматирования class, MaskFormatter, не убывает от InternationalFormatter class и не использует форматы. MaskFormatter обсуждается в Использовании MaskFormatter.


Можно настроить определенные аспекты формата, когда Вы создаете Format объект, и другие через специфичный для формата API. Например, DecimalFormat объекты, которые наследовались от NumberFormat и часто возвращаются его методами фабрики, может быть настроен при использовании setMaximumFractionDigits и setNegativePrefix методы. Для получения информации об использовании Format объекты, см. урок Форматирования следа Интернационализации.

Самый легкий способ связать специализированный формат с отформатированным текстовым полем состоит в том, чтобы создать поле при использовании JFormattedTextField конструктор, который берет a Format как параметр. Можно видеть эту ассоциацию в предыдущих примерах кода, которые создают amountField и rateField объекты.

Используя MaskFormatter

MaskFormatter class реализует средство форматирования, которое определяет точно, какие символы допустимы в каждой позиции текста поля. Например, следующий код создает a MaskFormatter это позволяет пользователю, чтобы ввести пятиразрядный почтовый индекс:

zipField = new JFormattedTextField(
                    createFormatter("#####"));
...
protected MaskFormatter createFormatter(String s) {
    MaskFormatter formatter = null;
    try {
        formatter = new MaskFormatter(s);
    } catch (java.text.ParseException exc) {
        System.err.println("formatter is bad: " + exc.getMessage());
        System.exit(-1);
    }
    return formatter;
}

Можно испытать результаты предыдущего кода, работая TextInputDemo. Нажмите кнопку Launch, чтобы работать, TextInputDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.

Запускает Приложение TextInputDemo

GUI программы выводится на экран.

Снимок TextInputDemo

Следующая таблица показывает символы, что можно использовать в маске форматирования:

Символ  Описание
# Любое допустимое число (Character.isDigit).
'
(одинарная кавычка)
Символ ESC, используемый, чтобы выйти из любого из специальных символов форматирования.
U Любой символ (Character.isLetter). Все строчные буквы отображаются на верхний регистр.
L Любой символ (Character.isLetter). Все прописные буквы отображаются на нижний регистр.
A Любой символ или число (Character.isLetter или Character.isDigit).
? Любой символ (Character.isLetter).
* Что-либо.
H Любой шестнадцатеричный символ (0-9, a-f или A-F).

Определение Средств форматирования и Используя Фабрики Средства форматирования

Определяя средства форматирования, имейте в виду, что каждый объект средства форматирования может использоваться самое большее одним отформатированным текстовым полем за один раз. У каждого поля должно быть по крайней мере одно средство форматирования, связанное с этим, которого точно каждый используется в любое время.

Можно определить средства форматирования, которые будут использоваться отформатированным текстовым полем несколькими способами:

Можно установить фабрику средства форматирования поля или создавая поле, используя конструктора, который берет параметр фабрики средства форматирования, или вызывая setFormatterFactory метод на поле. Чтобы создать фабрику средства форматирования, можно часто использовать экземпляр DefaultFormatterFactory class. A DefaultFormatterFactory объект позволяет Вам определить средства форматирования, возвращенные, когда значение редактируется, не редактируется, или имеет нулевое значение.

Следующие данные показывают приложение, основанное на FormattedTextFieldDemo пример, который использует фабрики средства форматирования, чтобы установить многократных редакторов для Количества Ссуды и полей APR. В то время как пользователь редактирует Количество Ссуды, символ $ не используется так, чтобы пользователь не был вынужден ввести это. Точно так же, в то время как пользователь редактирует поле APR, символ % не требуется.

Нажмите кнопку Launch, чтобы работать, FormatterFactoryDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.

Запускает Приложение FormatterFactoryDemo

FormatterFactoryDemo, с отредактированным полем количества FormatterFactoryDemo, без пользовательских редакторов устанавливается

Следующий код, который создает средства форматирования и устанавливает их при использовании экземпляров DefaultFormatterFactory class:

private double rate = .075;  //7.5 %
...
amountField = new JFormattedTextField(
                    new DefaultFormatterFactory(
                        new NumberFormatter(amountDisplayFormat),
                        new NumberFormatter(amountDisplayFormat),
                        new NumberFormatter(amountEditFormat)));
...
NumberFormatter percentEditFormatter =
        new NumberFormatter(percentEditFormat) {
    public String valueToString(Object o)
          throws ParseException {
        Number number = (Number)o;
        if (number != null) {
            double d = number.doubleValue() * 100.0;
            number = new Double(d);
        }
        return super.valueToString(number);
    }
    public Object stringToValue(String s)
           throws ParseException {
        Number number = (Number)super.stringToValue(s);
        if (number != null) {
            double d = number.doubleValue() / 100.0;
            number = new Double(d);
        }
        return number;
    }
};
rateField = new JFormattedTextField(
                     new DefaultFormatterFactory(
                        new NumberFormatter(percentDisplayFormat),
                        new NumberFormatter(percentDisplayFormat),
                        percentEditFormatter));
...
amountDisplayFormat = NumberFormat.getCurrencyInstance();
amountDisplayFormat.setMinimumFractionDigits(0);
amountEditFormat = NumberFormat.getNumberInstance();

percentDisplayFormat = NumberFormat.getPercentInstance();
percentDisplayFormat.setMinimumFractionDigits(2);
percentEditFormat = NumberFormat.getNumberInstance();
percentEditFormat.setMinimumFractionDigits(2);

Полужирный код выделяет звонки DefaultFormatterFactory конструкторы. Первый параметр конструктору определяет средство форматирования значения по умолчанию, чтобы использовать для отформатированного текстового поля. Второй параметр определяет средство форматирования дисплея, которое используется, когда у поля нет фокуса. Третий параметр определяет средство форматирования редактирования, которое используется, когда у поля есть фокус. Код не использует четвертый параметр, но если бы он сделал, то четвертый параметр определил бы нулевое средство форматирования, которое используется, когда значение поля является нулем. Поскольку никакое нулевое средство форматирования не определяется, средство форматирования значения по умолчанию используется, когда значение является нулем.

Код настраивает средство форматирования, которое использует percentEditFormat создавая подкласс NumberFormatter class. Этот подкласс переопределяет valueToString и stringToValue методы NumberFormatter так, чтобы они преобразовали выведенное на экран число в значение, фактически используемое в вычислениях, и преобразовали значение в число. Определенно, выведенное на экран число является 100 раз фактическим значением. Причина состоит в том, что процентный формат, используемый средством форматирования дисплея автоматически, выводит на экран текст как 100 раз значение, таким образом, соответствующее средство форматирования редактора должно вывести на экран текст в том же самом значении. FormattedTextFieldDemo пример не должен заботиться об этом преобразовании, потому что этот демонстрационный пример использует только один формат и для дисплея и для редактирования.

Можно найти код для всей программы в FormatterFactoryDemo.java.

Отформатированный API Текстового поля

Следующие таблицы приводят некоторые из обычно используемых API для того, чтобы использовать отформатированные текстовые поля.

Классы, Связанные с Отформатированными Текстовыми полями
Класс или Интерфейс Цель
JFormattedTextField Подкласс JTextField это поддерживает произвольные значения форматирования.
JFormattedTextField. AbstractFormatter Суперкласс всех средств форматирования для JFormattedTextField. Средство форматирования осуществляет политики редактирования и политики навигации, обрабатывает строку к преобразованиям объекта, и управляет JFormattedTextField по мере необходимости осуществлять требуемую политику.
JFormattedTextField.AbstractFormatterFactory Суперкласс всех фабрик средства форматирования. Каждый JFormattedTextField использует фабрику средства форматирования, чтобы получить средство форматирования, которое лучше всего соответствует состоянию текстового поля.
DefaultFormatterFactory Фабрика средства форматирования обычно используется. Обеспечивает средства форматирования, основанные на деталях, таких как состояние фокуса и передаваемые параметры.
DefaultFormatter Подкласс JFormattedTextField.AbstractFormatter это форматирует произвольные объекты при использовании toString метод.
MaskFormatter Подкласс DefaultFormatter это форматирует и редактирует строки, используя указанную символьную маску. (Например, семиразрядные номера телефона могут быть определены при использовании "###-####".)
InternationalFormatter Подкласс DefaultFormatter это использует экземпляр java.text.Format обработать преобразование в и от a String.
NumberFormatter Подкласс InternationalFormatter это поддерживает числовые форматы при использовании экземпляра NumberFormat.
DateFormatter Подкласс InternationalFormatter это поддерживает форматы даты при использовании экземпляра DateFormat.
Методы JFormattedTextField
Метод или Конструктор Цель
JFormattedTextField ()
JFormattedTextField (Объект)
JFormattedTextField (Формат)
JFormattedTextField (AbstractFormatter)
JFormattedTextField (AbstractFormatterFactory)
JFormattedTextField (AbstractFormatterFactory, Объект)
Создает новое отформатированное текстовое поле. Object параметр, если есть определяет начальное значение поля и заставляет соответствующую фабрику средства форматирования создаваться. Format или AbstractFormatter параметр определяет формат или средство форматирования, которое будет использоваться для поля, и заставляет соответствующую фабрику средства форматирования создаваться. AbstractFormatterFactory параметр определяет фабрику средства форматирования, которая будет использоваться, который определяет, какие средства форматирования используются для поля.
освободите setValue (Объект)
Возразите getValue ()
Наборы или получают значение отформатированного текстового поля. Следует бросить тип возврата, основанный на как JFormattedTextField был сконфигурирован. Если средство форматирования еще не было установлено, вызывая setValue устанавливает средство форматирования в один возвращенный фабрикой средства форматирования поля.
освободите setFormatterFactory (AbstractFormatterFactory) Устанавливает объект, который определяет средства форматирования, используемые для отформатированного текстового поля. Объект часто является экземпляром DefaultFormatterFactory class.
AbstractFormatter getFormatter () Получает средство форматирования отформатированного текстового поля. Средство форматирования часто является экземпляром DefaultFormatter class.
освободите setFocusLostBehavior (интервал) Определяет результат поля, теряющего фокус. Возможные значения определяются в JFormattedTextField как COMMIT_OR_REVERT (значение по умолчанию), COMMIT (фиксация если допустимый, иначе оставьте все тем же самым), PERSIST (ничего не сделайте), и REVERT (измените текст, чтобы отразить значение).
освободите commitEdit () Устанавливает значение в объект, представленный текстом поля, как определено средством форматирования поля. Если текст недопустим, значение остается тем же самым и a ParseException бросается.
булев isEditValid () Возвращает true, если средство форматирования полагает, что текущий текст допустим, как определено средством форматирования поля.
Опции DefaultFormatter
Метод Цель
освободите (булев) setCommitsOnValidEdit
булев getCommitsOnValidEdit ()
Наборы или получают значения, когда редактирования пододвигаются обратно к JFormattedTextField. Если true, commitEdit вызывается после каждого допустимого редактирования. Это свойство false по умолчанию.
освободите (булев) setOverwriteMode
булев getOverwriteMode ()
Наборы или получают поведение, вставляя символы. Если true, новые символы перезаписывают существующие символы в модели, поскольку они вставляются. Значение по умолчанию этого свойства true в DefaultFormatter (и таким образом в MaskFormatter) и false в InternationalFormatter (и таким образом в DateFormatter и NumberFormatter).
освободите (булев) setAllowsInvalid
булев getAllowsInvalid ()
Наборы или интерпретируют, позволяют ли отредактированному значению быть недопустимым долго. Часто удобно позволить пользователю ввести недопустимые значения до commitEdit метод предпринимается. DefaultFormatter инициализирует это свойство к true. Из стандартных средств форматирования Swing, только MaskFormatter наборы это свойство к false.

Примеры То Использование Отформатированные Текстовые поля

Эта таблица приводит примеры, которые используют отформатированные текстовые поля и точки туда, где те примеры описываются.

Пример Где Описано Примечания
FormattedTextFieldDemo Этот раздел Использование четыре отформатированных текстовых поля.
SpinnerDemo Как Использовать Прядильщиков Настраивает появление отформатированных текстовых полей, используемых двумя прядильщиками.
Преобразователь Используя Модели Каждый ConversionPanel соединяет отформатированное текстовое поле с ползунком.
TextInputDemo Этот раздел Шоу, как использовать текстовые поля, прядильщиков, и отформатированные текстовые поля вместе, и демонстрирует, как использовать MaskFormatter. Включает код для того, чтобы выбрать текст поля, которое только что получило фокус.
FormatterFactoryDemo Этот раздел Изменение на FormattedTextFieldDemo, который использует фабрики средства форматирования, чтобы определить многократные средства форматирования для двух отформатированных текстовых полей.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Использовать Селекторов Файла
Следующая страница: Как Сделать Фреймы (Главные окна)