Текстовое поле форматирования даты

Есть ли способ иметь текстовое поле, которое проверяется в формате дд / мм / гггг и не допускает других символов? Мне удалось проверить это, так что это только цифры, но наличие чисел и косых черт оказывается проблемой.

Я использую JAVAFX.

1 ответ

Решение

Я создал элемент управления датой, который основан на текстовом поле: https://github.com/nablex/jfx-control-date/ Он позволяет вам установить формат (поддерживается SimpleDateFormat) и поддерживает всплывающее окно для выбора мыши.

Вы также можете ввести значения, набрав (допустимы только допустимые значения) и просматривая поля с помощью кнопок со стрелками (влево и вправо будут перемещаться, вверх и вниз будут увеличиваться / уменьшаться).

Пример кода (также можно найти в тестовом классе на github):

DatePicker picker = new DatePicker();

// you may not want the controls to manipulate time, they are on by default however
picker.setHideTimeControls(true);

// optional: the format you want the date to be in for the user
picker.formatProperty().setValue("yyyy/MM/dd HH:mm:ss.SSS");

// optional: set timezone
picker.timezoneProperty().setValue(TimeZone.getTimeZone("CET"));

// optional: set locale
picker.localeProperty().setValue(new Locale("nl"));

// react to changes
picker.timestampProperty().addListener(new ChangeListener<Long>() {
    @Override
    public void changed(ObservableValue<? extends Long> arg0, Long oldValue, Long newValue) {
        // do something
    }
});

ОБНОВИТЬ

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

Например, этот фильтр будет блокировать любые даты до случайного момента времени:

    picker.filterProperty().setValue(new DateFilter() {
        @Override
        public boolean accept(Date date) {
            SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd");
            try {
                return date.after(parser.parse("2010-07-13"));
            }
            catch (ParseException e) {
                return false;
            }
        }
    });
Другие вопросы по тегам