- Что лучше использовать для выбора даты в календаре?
- Пример компонента JDatePicker
- Описание примера
- 1. Описание полей класса
- 2. Формирование интерфейса
- 3. Определение первого дня недели
- 4. Локализация
- 5. Чтение значений
- 6. Главный класс ExampleDatePicker
- Привязка выпадающего календаря к правому/левому краю компонента
- Старт примера
- Скачать пример
- Есть ли хороший и бесплатный инструмент выбора даты и времени для Java Swing?
- 6 ответов
Что лучше использовать для выбора даты в календаре?
Выбора даты в календаре
Есть сайт, где есть календарь, там пытаюсь установить дату с 10 по 10.
Запрет выбора даты на календаре
Здравствуйте. Я хочу чтобы пользователь мог выбирать на календаре даты только за определённый.
появление текстбокса после выбора даты в календаре
я выбираю определенную дату в календаре, нажимаю на число и мне надо, чтобы появился текстбокс.
Как запарсить данные, которые генерируются после выбора даты в календаре
Добрый день. Имеется к примеру такая страница В конце строки Сеансы в кинотеатрах *** вторник 8.
Что использовать для выбора директории
Здравствуйте. Подскажите какой — нибудь действующий вариант выбора директории (папки), и возможно.
А так всё от задач зависит.
я вообще не об этом, какой элемент управления использовать для выбора даты?
пробую щас JXDatePicker, как то мало примеров с ним .
Что лучше использовать для WCF?
Здравствуйте! У меня есть клиент-серверное приложение, общающееся по WCF (именно проект, написанный.
что лучше использовать для резервного копирования
что лучше использовать для ежедневного резервного копирования БД в ночное время: 1) Из.
Что лучше использовать для хранения переменной?
я не знаю как работает my.settings не обращается ли приложение к жесткому диску при вызове.
C++ vs C#. Что лучше использовать для поставленных задач?
Приветствую всех. Интересует, что под мои задачи больше всего подходит. C++ либо C#. C++ манит.
БД: что лучше использовать для создания базы?
возникла проблема, есть база данный в тхт,но там с ней работать крайне не удобно данные лучше.
Что лучше использовать для свойств объекта?
Мне нужно хранить свойства каких то объектов. То есть, строка и для этой строки какое то значение .
Пример компонента JDatePicker
В статье рассмотрен пример (example-datepicker) использования компонента JDatePicker модуля base-gui, позволяющего выбирать дату из выпадающего календаря. В основе компонента лежит код, созданный Juan Heyns. Доработанный компонент локализован для русского, английского и немецкого языков, позволяет определить первый день недели [Воскресенье, Понедельник].
На следующем скриншоте представлен интерфейс примера.
В примере рассмотрены следующие возможности API компонента JDatePicker модуля base-gui :
- определение первого дня недели [Вс, По];
- локализация календаря;
- чтение выбранной даты;
- привязка выпадающего календаря к правому/левому краю компонента.
Описание примера
Пример включает класс ExampleDatePicker, который будет представлен в статье следующим образом :
- Описание полей класса.
- Формирование интерфейса.
- Определение первого дня недели.
- Локализация.
- Чтение значений.
- Главный класс ExampleDatePicker.
1. Описание полей класса
Описание полей класса ExampleDatePicker включает метки lblFilter, lblFrom и lblTo, компоненты даты dtFrom и dtTo, константы (модификаторы final не приведены в листинге) определения надписей кнопок управления FIRST_DAY, FIRST_DAYS, LOCALIZATION, CHOOSE. Объекты локализации locale (текущий) и locales (возможные), идентификаторы первого дня недели FIRST_DAY_IDX и текущей локализации LOCALE_idx. Константа PATTERN_DATE определяет формат представления даты в интерфейсе примера. Константа SPAN_normal определяет порядок представления надписей на кнопках.
JLabel lblFilter = null; JLabel lblFrom = null; JLabel lblTo = null; JDatePickerImpl dtFrom = null; JDatePickerImpl dtTo = null; String[] FIRST_DAY = ", "Week from ", "Woche ab ">; String[][] FIRST_DAYS = , , >; String[] LOCALIZATION = ; String[] CHOOSE = ; Locale locale = null; Locale[] locales = ; int FIRST_DAY_IDX = 0; int LOCALE_idx = 0; String PATTERN_DATE = "dd.MM.yyyy"; String SPAN_normal = "";
2. Формирование интерфейса
Метод createGUI формирует интерфейс примера. Особый интерес в коде данного метода представляют строки создания двух компонентов JDatePicker :
- раздельные модели (modelFrom, modelTo) для двух компонентов дат; в противном случае будет единое значение даты в обоих компонентах;
- раздельные панели (datePanelFrom, datePanelTo) для двух компонентов дат; каждая панель использует свою модель, в противном случае будет единое значение даты в обоих компонентах;
- вторым параметром в конструктор JDatePanelImpl передается объект локализации, определяющий языковые надписи, дни недели, список месяцев;
- конструктор JDatePickerImpl в качестве параметров получает значения JDatePanelImpl (модель даты) и DateLabelFormatter (формат даты).
Примечание : обратите внимание, что для компонентов используются разные модели дат (UtilDateModel, UtilCalendarModel).
private void createGUI() < JPanel pnlFilter = new JPanel(); pnlFilter.setLayout(new BorderLayout()); pnlFilter.setPreferredSize(new Dimension(268, 80)); Border border = BorderFactory.createCompoundBorder( BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder(15, 10, 15, 4)); pnlFilter.setBorder(border); lblFilter = new JLabel(); lblFilter.setText(SPAN_normal + "Период времени"); // Определение параметров компонентов дат 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(PATTERN_DATE); //----------------------------------------------------- Dimension dim = new Dimension(100, 20); Dimension dimLabel = new Dimension( 30, 20); //----------------------------------------------------- lblFrom = new JLabel(); lblFrom.setText(SPAN_normal + "c"); lblFrom.setPreferredSize(dimLabel); dtFrom = new JDatePickerImpl(datePanelFrom, dlf); dtFrom.setPreferredSize(new Dimension(145, 20)); dtFrom.getJFormattedTextField().setBackground(Color.WHITE); SpringLayout layoutFilter = new SpringLayout(); JPanel pnlFrom = new JPanel(layoutFilter); pnlFrom.add(lblFrom); pnlFrom.add(dtFrom); pnlFrom.setPreferredSize(dim); pnlFrom.setSize (dim); layoutFilter.putConstraint(SpringLayout.WEST, dtFrom, 30, SpringLayout.EAST, lblFrom); //----------------------------------------------------- lblTo = new JLabel(); lblTo.setText(SPAN_normal + "по"); lblTo.setPreferredSize(dimLabel); dtTo = new JDatePickerImpl(datePanelTo, dlf); dtTo.setPreferredSize(new Dimension(145, 20)); dtTo.getJFormattedTextField().setBackground(Color.WHITE); JPanel pnlTo = new JPanel(layoutFilter); pnlTo.add(lblTo); pnlTo.add(dtTo); pnlTo.setPreferredSize(dim); pnlTo.setSize (dim); layoutFilter.putConstraint(SpringLayout.WEST, dtTo, 30, SpringLayout.EAST, lblTo); //----------------------------------------------------- pnlFilter.add(pnlFrom, BorderLayout.NORTH); pnlFilter.add(pnlTo , BorderLayout.SOUTH); //----------------------------------------------------- String caption = SPAN_normal + String.format(FIRST_DAY[LOCALE_idx], FIRST_DAYS[LOCALE_idx][FIRST_DAY_IDX]); JButton btnFirstDay = new JButton(caption); String caption = SPAN_normal + LOCALIZATION[LOCALE_idx]; JButton btnLocale = new JButton(caption); String caption = SPAN_normal + CHOOSE[LOCALE_idx]; JButton btnFilter = new JButton(caption); final int WIDTH_BUTTON = 130; dim = new Dimension (WIDTH_BUTTON, 28); btnFirstDay.setPreferredSize(dim); btnLocale .setPreferredSize(dim); btnFilter .setPreferredSize(dim); // Панель кнопок управления JPanel pnlButtons = new JPanel(); pnlButtons.add(btnFirstDay); pnlButtons.add(btnLocale ); pnlButtons.add(btnFilter ); btnFirstDay.addActionListener(new ActionListener() < @Override public void actionPerformed(ActionEvent e) < changeFirstWeekDay(); String caption = SPAN_normal + String.format(FIRST_DAY[LOCALE_idx], FIRST_DAYS[LOCALE_idx][FIRST_DAY_IDX]); btnFirstDay.setText(caption); >>); btnLocale.addActionListener(new ActionListener() < @Override public void actionPerformed(ActionEvent e) < changeLocale(); btnLocale .setText(SPAN_normal + LOCALIZATION[LOCALE_idx]); btnFilter .setText(SPAN_normal + CHOOSE[LOCALE_idx]); btnFirstDay.setText(SPAN_normal + String.format(FIRST_DAY[LOCALE_idx], FIRST_DAYS[LOCALE_idx][FIRST_DAY_IDX])); >>); btnFilter.addActionListener(new ActionListener() < @Override public void actionPerformed(ActionEvent e) < ChoosedDates(); >>); getContentPane().add(lblFilter , BorderLayout.NORTH ); getContentPane().add(pnlFilter , BorderLayout.CENTER); getContentPane().add(pnlButtons, BorderLayout.SOUTH); >
Обработчики нажатий кнопок управления вызывают методы изменения первого дня недели и текущего языка локализации, вывода сообщения с выбранными датами.
3. Определение первого дня недели
Исходный код компонента JDatePicker, созданный Juan Heyns, допускает только один вариант первого дня недели «Su» (Sunday). Модифицированный компонент JDatePicker модуля base-gui позволяет выбрать первым днём недели как «Понедельник» (Monday), так и «Воскресенье» (Sunday). Для изменения текущего первого дня недели перезагрузки компонента не требуется, достаточно вызвать метод компонента setFirstDayMonday (boolean); истинное значение параметра (true) определяет первый день недели «Понедельник» (Monday). Ниже представлен листинг метода changeFirstWeekDay, который динамически в режиме run-time изменяет первый день недели в окне календаря.
private void changeFirstWeekDay()
На следующем скриншоте представлен открытый календарь компонента с первым днем недели «По» (Понедельник).
На скриншоте описания локализации (см. скриншот ниже) представлено окно календаря с первым днём недели «Su» (Sunday/Воскресенье).
4. Локализация
Локализация в примере касается только наименований кнопок и выпадающего окна календаря. Модифицированный компонент JDatePicker модуля base-gui позволяет использовать один из 3-х языков локализации : [русский (по умолчанию), английский, немецкий]. Для переключения языка локализации не требуется перезагрузка компонента, достаточно вызвать метод компонента changeLocale с объектом локализации, например changeLocale(new Locale(«ru»)). Ниже представлен листинг метода changeLocale, который динамически в режиме run-time изменяет язык локализации окна раскрывающегося календаря.
private void changeLocale() < if (++LOCALE_idx >= locales.length) LOCALE_idx = 0; dtFrom.changeLocale(locales[LOCALE_idx]); dtTo .changeLocale(locales[LOCALE_idx]); >
На скриншоте описания первого дня недели (см.скриншот выше) представлена русскоязычная версия открытого календаря. На следующем скриншоте представлен раскрытый календарь в английской интерпретации : окно выбора месяца, надписи и дни недели представлены на английском языке.
5. Чтение значений
Метод ChoosedDates формирует сообщение с выбранными датами и отображает его в диалоговом окне JOptionPane главного JFrame. Для получения значения даты следует использовать метод getValue модели данных (getModel()) компонента. Если значение даты не определено/выбрано, то метод вернет ‘null’.
Примечание : поскольку компоненты дат (dtFrom, dtTo) используют разные модели(UtilDateModel и UtilCalendarModel), то имеются и существенные отличия получения выбранного значения даты.
private void ChoosedDates() < // Выбранные строки String msg = "Вы выбрали период с '%s' по '%s'"; String title = "Выбор"; String from = "null"; String to = "null"; SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); if (dtFrom.getModel().getValue() != null) from = sdf.format(dtFrom.getModel().getValue()); if ((dtTo.getModel() instanceof UtilDateModel) && (dtTo.getModel().getValue() != null)) to = sdf.format(dtTo.getModel().getValue()); else if ((dtTo.getModel() instanceof UtilCalendarModel) && (dtTo.getModel().getValue() != null)) < Calendar calendar; calendar = (Calendar) dtTo.getModel().getValue(); to = sdf.format(calendar.getTime()); >msg = String.format(msg, from, to); JOptionPane.showMessageDialog (ExampleDatePicker.this, msg, title, JOptionPane.INFORMATION_MESSAGE); >
На следующем скриншоте представлено окно с сообщением.
6. Главный класс ExampleDatePicker
Листинг класса ExampleDatePicker (см. код ниже), не включает поля и методы, описанные выше. Полный исходный код примера можно скачать в конце страницы.
В конструкторе класса определяется текущий язык локализации и вызывается метод создания интерфейса.
public class ExampleDatePicker extends JFrame < public ExampleDatePicker() < super("Form example"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(440, 180); locale = locales[LOCALE_idx]; createGUI(); vsetVisible(true); >public static void main(String[] args) < new ExampleDatePicker(); >>
Привязка выпадающего календаря к правому/левому краю компонента
На представленных выше скриншотах видно, что размер компонента по горизонтали меньше ширины открытого календаря. При этом, окно календаря привязано к левой стороне компонента. Исходный JDatePicker, созданный Juan Heyns, не допускал привязку окна календаря к правой стороне компонента при его близком размещении к правой стороне экрана; в этом случае часть календаря не отображалась на экране. Единственным спасением в этом случае было определять ширину компонента не меньше ширины окна календаря.
Доработанный JDatePicker модуля base-gui автоматически привязывает всплывающее окно календаря к правому краю компонента при его близком расположении к правой стороне монитора. Чтобы увидеть это достаточно переместить мышью окно примера в правую часть монитора и открыть окно календаря, как это представлено на следующем скриншоте.
Старт примера
Архив примера включает командный файл run-example-datepicker.bat для старта example-datepicker.jar в Windows из командной строки. Запускаемый example-datepicker.jar (runable) может быть стартован не только из командной строки, но и обычным способом (двойным нажатием клавишей мыши), поскольку модуль lib/base-gui-1.0.0.jar включен в classpath манифеста META-INF/MANIFEST.MF.
Скачать пример
Архивный файл base-gui-example.zip включает данный пример (example-datepicker) и другие примеры использования модуля base-gui.
Есть ли хороший и бесплатный инструмент выбора даты и времени для Java Swing?
Есть ли хороший и свободный выбор даты и времени для Java Swing? Есть много выбора даты, но нет выбора даты и времени. Это самое близкое, к которому я дошел до сих пор: Ищет дату и выбор времени Кто-нибудь?
6 ответов
Для выбора времени вы можете использовать JSpinner и установить JSpinner.DateEditor, который отображает только значение времени.
JSpinner timeSpinner = new JSpinner( new SpinnerDateModel() ); JSpinner.DateEditor timeEditor = new JSpinner.DateEditor(timeSpinner, "HH:mm:ss"); timeSpinner.setEditor(timeEditor); timeSpinner.setValue(new Date()); // will only show the current time
Вы также можете использовать библиотеку, такую как JDatePicker: jdatepicker.org совместно, чтобы выбрать дату.
Библиотека LGoodDatePicker включает в себя хороший компонент DateTimePicker . (А также отдельные классы DatePicker и TimePicker). Три компонента просты и удобны в использовании. Вот несколько скриншотов компонентов и демонстрационного приложения. Скриншот 1 , Скриншот 2 . Домашняя страница проекта находится по адресу github.com/LGoodDatePicker/LGoodDatePicker .
JSpinners, IMO, ужасны и трудны в работе. Ответ lbalazscs дает гораздо более привлекательный вид, если вам нужны и дата, и время.
Вы можете расширить компонент Swingx JXDatePicker:
«JXDatePicker обрабатывает даты без времени. Довольно часто нам нужно разрешить пользователю выбирать дату и время. Это пример того, как использовать JXDatePicker для обработки даты и времени вместе».
EDIT: эта статья исчезла из Интернета, но, как обнаружил SingleShot, она по-прежнему доступна в интернет-архиве. Чтобы быть уверенным, вот полный рабочий пример:
import org.jdesktop.swingx.calendar.SingleDaySelectionModel; import org.jdesktop.swingx.JXDatePicker; import javax.swing.*; import javax.swing.text.DefaultFormatterFactory; import javax.swing.text.DateFormatter; import java.text.DateFormat; import java.text.ParseException; import java.util.*; import java.awt.*; /** * This is licensed under LGPL. License can be found here: http://www.gnu.org/licenses/lgpl-3.0.txt * * This is provided as is. If you have questions please direct them to charlie.hubbard at gmail dot you know what. */ public class DateTimePicker extends JXDatePicker < private JSpinner timeSpinner; private JPanel timePanel; private DateFormat timeFormat; public DateTimePicker() < super(); getMonthView().setSelectionModel(new SingleDaySelectionModel()); >public DateTimePicker( Date d ) < this(); setDate(d); >public void commitEdit() throws ParseException < commitTime(); super.commitEdit(); >public void cancelEdit() < super.cancelEdit(); setTimeSpinners(); >@Override public JPanel getLinkPanel() < super.getLinkPanel(); if( timePanel == null ) < timePanel = createTimePanel(); >setTimeSpinners(); return timePanel; > private JPanel createTimePanel() < JPanel newPanel = new JPanel(); newPanel.setLayout(new FlowLayout()); //newPanel.add(panelOriginal); SpinnerDateModel dateModel = new SpinnerDateModel(); timeSpinner = new JSpinner(dateModel); if( timeFormat == null ) timeFormat = DateFormat.getTimeInstance( DateFormat.SHORT ); updateTextFieldFormat(); newPanel.add(new JLabel( "Time:" ) ); newPanel.add(timeSpinner); newPanel.setBackground(Color.WHITE); return newPanel; >private void updateTextFieldFormat() < if( timeSpinner == null ) return; JFormattedTextField tf = ((JSpinner.DefaultEditor) timeSpinner.getEditor()).getTextField(); DefaultFormatterFactory factory = (DefaultFormatterFactory) tf.getFormatterFactory(); DateFormatter formatter = (DateFormatter) factory.getDefaultFormatter(); // Change the date format to only show the hours formatter.setFormat( timeFormat ); >private void commitTime() < Date date = getDate(); if (date != null) < Date time = (Date) timeSpinner.getValue(); GregorianCalendar timeCalendar = new GregorianCalendar(); timeCalendar.setTime( time ); GregorianCalendar calendar = new GregorianCalendar(); calendar.setTime(date); calendar.set(Calendar.HOUR_OF_DAY, timeCalendar.get( Calendar.HOUR_OF_DAY ) ); calendar.set(Calendar.MINUTE, timeCalendar.get( Calendar.MINUTE ) ); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date newDate = calendar.getTime(); setDate(newDate); >> private void setTimeSpinners() < Date date = getDate(); if (date != null) < timeSpinner.setValue( date ); >> public DateFormat getTimeFormat() < return timeFormat; >public void setTimeFormat(DateFormat timeFormat) < this.timeFormat = timeFormat; updateTextFieldFormat(); >public static void main(String[] args) < Date date = new Date(); JFrame frame = new JFrame(); frame.setTitle("Date Time Picker"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DateTimePicker dateTimePicker = new DateTimePicker(); dateTimePicker.setFormats( DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.MEDIUM ) ); dateTimePicker.setTimeFormat( DateFormat.getTimeInstance( DateFormat.MEDIUM ) ); dateTimePicker.setDate(date); frame.getContentPane().add(dateTimePicker); frame.pack(); frame.setVisible(true); >>