410013796724260
• Webmoney
R335386147728
Z369087728698
в помощь разработчикам 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 может использовать одну из трёх моделей даты, обеспечивая получения значения одного из трёх типов дат :
Следующий код из примера 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 и содержит исходные коды. |