Афоризм
О, как не вовремя порой приходит время.
Наталья Резник
Последние статьи

 • RawContacts
Необработанные контакты в Android
 • javax.crypto.Cypher
Cимметричное шифрование и дешифрирование
 • Random, Math.random
Генерация случайных чисел
 • Компонент JDatePicker
Описание и пример компонента JDatePicker
 • Компонент Tree
Описание и пример дерева Tree библиотеки base-gui
 • Grid с навигатором
Описание и пример Gridp с навигатором
 • Компонент Grid
Описание и пример Grid библиотеки base-gui
 • Библиотека base-gui
Описание компонентов библиотеки base-gui
 • Оператор SELECT
Использование SQL-оператора SELECT
в помощь разработчикам Swing-приложений

Описание компонента JDatePicker

Компонент JDatePicker представляет текстовое поле даты с кнопкой, при нажатии на которую открывается окно с календарем для выбора даты. В основе компонента лежит код, созданный разработчиком Juan Heyns, который Вы можете скачать.

Доработка компонента связана с :

  • возможностью определения первого дня недели [Воскресенье, Понедельник];
  • локализацией календаря : использования текстовых надписей на русском, английском и немецком языках;
  • привязкой выпадающего окна календаря к правому/левому краю компонента.

Состав компонента JDatePicker библиотеки base-gui включает интерфейсы и классы пакета org.jdatepicker.

Поскольку компонент был разработан давно и в интернете достаточно информации об его использовании, то здесь будут рассмотрены только основные и отличительные особенности модифицированного компонента JDatePicker библиотеки base-gui. С описанием исходного компонента JDatePicker можно познакомиться на странице JDatePicker: Java Swing Date Picker (SourceForge).

Создание компонента

Примечание : JDatePicker представляет собой интерфейс, а JDatePickerImpl – класс, реализующий методы данного интерфейса. К сожалению, количество открытых (public) методов класса JDatePickerImpl значительно больше, чем об этом заявлено в интерфейсе JDatePicker. Поэтому в коде при определении переменной даты используется тип JDatePickerImpl, а не JDatePicker, как это желательно было бы представить. Но поскольку это уже «устоялось» годами, то было решено ничего не менять в данной части модифицированного компонента. Т.е. при объявлении компонента будет использоваться класс JDatePickerImpl, а не интерфейс JDatePicker.

Для создания и размещения компонента JDatePicker в интерфейсе приложения необходимо определить модель даты UtilDateModel и связанную с ней панель JDatePanelImpl (DateModel<?>). Конструктор JDatePickerImpl в качестве параметров получает панель JDatePanelImpl и объект JFormattedTextField.AbstractFormatter, определяющий, формат представления даты.

Поскольку модифицированный компонент выбора даты локализован, то класс JDatePanelImpl дополнен еще одним конструктором с объектом локализации JDatePanelImpl (DateModel<?>, Locale). По умолчанию, если используется конструктор без объекта локализации, то в компоненте будет установлен русский язык. Следующий код демонстрирует пример создания компонента JDatePickerImpl :

// Компонент даты
JDatePickerImpl dtp      = null;
// Модель даты
UtilDateModel   uiModel  = null;
// Панель даты
JDatePanelImpl  dtpPanel = null;

// Формат представления даты в компоненте
DateLabelFormatter  dlf  = null;

Locale locale = new Locale("en");

// Создание компонента даты
uiModel  = new UtilDateModel();
dtpPanel = new JDatePanelImpl    (uiModel, locale);
dlf      = new DateLabelFormatter("dd.MM.yyyy");

dtp = new JDatePickerImpl(dtpPanel, dlf);
// dtp.getJFormattedTextField().setBackground(Color.WHITE);

frame.add(dtp);

В результате выполнения данного кода в интерфейсе будет представлен компонент JDatePicker в следующем виде :

JDatePicker содержит недоступное (по умолчанию) для редактирования текстовое поле с датой (пустое) и кнопку для открытия всплывающего окна календаря. Текстовое поле даты по умолчанию серого цвета. В примере можно убрать комментарий для представления поля даты белым цветом (или каким-либо другим).

На следующем скриншоте представлен интерфейс примера example-datepicker с компонентами JDatePicker; окно календаря верхнего компонента открыто. После выбора мышкой даты, окно закрывается автоматически.

Модель даты

JDatePicker может использовать одну из трёх моделей даты, обеспечивая получения значения одного из трёх типов дат :

• UtilDateModel : компонент вернет значение объекта типа java.util.Date;
• CalendarDateModel: компонент вернет значение объекта типа java.util.Calendar.
• SqlDateModel : компонент вернет значение объекта типа java.sql.Date.

Следующий код из примера example-datepicker демонстрирует возможность использования двух компонентов JDatePicker с разными моделями дат (UtilDateModel и UtilCalendarModel).

import java.util.Date;
import java.util.Calendar;

import org.jdatepicker.impl.JDatePanelImpl;
import org.jdatepicker.impl.JDatePickerImpl;
import org.jdatepicker.impl.UtilDateModel;
import org.jdatepicker.impl.UtilCalendarModel;

. . .

/*
 * Определяем английский. язык; по умолчанию
 * используется русский
 */
Locale locale = new Locale("en");

JDatePickerImpl     dtFrom        ;
JDatePickerImpl     dtTo          ;

UtilDateModel       modelFrom     ;
UtilCalendarModel   modelTo       ;

JDatePanelImpl      datePanelFrom ;
JDatePanelImpl      datePanelTo   ;

DateLabelFormatter  dlf           ;

modelFrom     = new UtilDateModel();
modelTo       = new UtilCalendarModel();

datePanelFrom = new JDatePanelImpl(modelFrom, locale);
datePanelTo   = new JDatePanelImpl(modelTo  , locale);

dlf           = new DateLabelFormatter("dd.MM.yyyy");

. . .

dtFrom = new JDatePickerImpl(datePanelFrom, dlf);
dtFrom.getJFormattedTextField().setBackground(Color.WHITE);

dtTo = new JDatePickerImpl(datePanelTo, dlf);
dtTo.getJFormattedTextField().setBackground(Color.WHITE);

. . .

Date date = dtFrom.getModel().getValue();
System.out.println("" + date);

Calendar calendar = (Calendar) dtTo.getModel().getValue();
date calendar.getTime();
System.out.println("" + date);

Инициализация значения

По умолчанию значение компонента JDatePicker не инициализировано. Для инициализации значения необходимо вызвать метод setDate(yyyy, MM, dd) модели даты. Инициализация значения касается только календаря, т.е. при выборе даты (открытии календаря) будет представлен соответствующий месяц года. Для того, чтобы инициализировать текстовое поле даты компонента необходимо вызвать метод модели даты setSelected, как это представлено в следующем коде :

// Модель даты
UtilDateModel model = new UtilDateModel();

// Инициализация значения 2019-02-28
model.setDate(2019, 1, 28);

// Отображение в текстовом поле
model.setSelected(true);

Необходимо отметить, что метод setDate(yyyy, MM, dd) определен в классе AbstractDateModel, свойства которого все модели дат наследуют.

Формат представления даты

При создании объекта JDatePickerImpl в качестве второго параметра конструктору передается значение типа DateLabelFormatter. Вы можете определить нужный формат представления даты в текстовом поле. В приведенных выше примерах демонстрируются настройки на формат представления даты 'dd.MM.yyyy'.

В следующем примере демонстрируется создание компонента с используемыми по умолчанию настройками формата представления даты и языка локализации. По умолчанию дата в модифицированном компоненте JDatePicker будет представлена в формате 'yyyy-MM-dd', язык локализации – русский.

JDatePickerImpl     dtFrom        ;
UtilDateModel       modelFrom     ;
JDatePanelImpl      datePanelFrom ;
DateLabelFormatter  dlf           ;

modelFrom     = new UtilDateModel();
datePanelFrom = new JDatePanelImpl(modelFrom);
dlf           = new DateLabelFormatter();

dtFrom = new JDatePickerImpl(datePanelFrom, dlf);

Редактируемое поле даты

По умолчанию текстовое поле даты заблокировано и пользователь может только выбрать дату в окне выпадающего календаря. Класс JdatePickerImpl содержит метод setTextEditable(boolean), вызвав который со значением true, Вы открываете поле даты для редактирования. После этого определять значение даты можно как в поле даты с помощью клавиатуры, так и мышью в окне календаря.

Метод isTextEditable() класса JdatePickerImpl возвращает логическое значение (true/false), определяющее редактируемость поля даты.

Первый день недели

В исходном компонента JDatePicker, созданным Juan Heyns, используется только один вариант первого дня недели «Su» (Sunday). Модифицированный компонент JDatePicker модуля base-gui позволяет определить первым днём недели как «Понедельник» (Monday), так и «Воскресенье» (Sunday). Для изменения текущего первого дня недели перезагрузки компонента не требуется, достаточно вызвать метод компонента setFirstDayMonday (boolean); истинное значение параметра (true) определяет первый день недели «Понедельник» (Monday). Ниже представлен пример изменения первого дня недели выпадающего окна календаря :

JDatePickerImpl dp;
. . .

dp.setFirstDayMonday (!dp.isFirstDayMonday());

Локализация

Согласно документации JDatePicker обеспечивает «Localisation support». Но практически, если Вы будете просматривать исходный код, то увидите, что не все так «гладко», как хотелось бы. Так, для выбора списка дней недели и месяцев используется класс DateFormatSymbols без параметра локализации, т.е. без передачи ему определенного объекта Locale, используемого в приложении. Следовательно, все будет зависеть не от желания программиста, использовать тот или иной язык локализации, а от «настроек» системы, и на разных компьютерах может быть разный язык локализации. Кроме этого метод getMonths() класса DateFormatSymbols возвращает наименования месяцев для кириллицы (ru) в родительном падеже : [января, февраля, марта, ...]. Для английского и немецкого языков метод getMonths() возвращает наименования месяцев, у которых первый символ прописной, все корректно. Для русского языка (возможно и для других, не проверял) наименования месяцев получаем не в очень приглядном виде для представления в календаре.

В модифицированном компоненте JDatePicker библиотеки base-gui локализация обеспечивается для трех языков : русский (по умолчанию), английский и немецкий. Для переключения языка локализации не требуется перезагрузка компонента, достаточно вызвать метод компонента changeLocale с объектом локализации. Следующий код устанавливает немеций язык локализации окна календаря (компонента) :


JDatePickerImpl dp;
. . .

dp.changeLocale(new Locale("de"));

Привязка окна календаря

В исходном JDatePicker, созданным Juan Heyns, окно календаря привязано к левой стороне текстового поля даты (компонента). В случае, если размер компонента меньше, чем размер вслывающего окна календаря, то при размещении такого компонента вблизи к правой стороне экрана часть календаря становится невидимой/недоступной. Единственным спасением в этом случае является определение ширины компонента не меньше ширины окна календаря.

Доработанный JDatePicker библиотеки base-gui автоматически привязывает всплывающее окно календаря к правому краю компонента при его близком расположении к правой стороне монитора.

Пример использования JDatePicker

Пример использования модифицированного компонента JDatePicker включен в архив примеров библиотеки base-gui и содержит исходные коды.

  Рейтинг@Mail.ru