powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFX: маска на полле ввода даты в элементе DatePicker
14 сообщений из 14, страница 1 из 1
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247159
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, кто знает как реализовать ввод даты пс маской?
Имеется ввиду следующее:
пользователь ввел "12"
после он вводит "1" - в поле появляется "12.1" и т.д.
Соответственно введя 01012001 я должен выдить "01.01.2001".

Сам добился следующего:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
myDatePicker.setConverter(new StringConverter<LocalDate>() {
     
            String pattern = "dd.MM.yyyy";
            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(pattern);

            {
                anfragedatumPicker.setPromptText(pattern.toLowerCase());
            }

            @Override 
            public String toString(LocalDate date) {
                if (date != null) {
                    return dateFormatter.format(date);
                } else {
                    return "";
                }
            }

            //Workaround to make insert without points possible *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
            @Override 
            public LocalDate fromString(String string) {
                if (string != null && !string.isEmpty()) {
                    if (string.contains(".")) {
                        return LocalDate.parse(string, dateFormatter);             
                    } else {
                        return LocalDate.parse(string.substring(0, 2) + "." + string.substring(2, 4) + "." + string.substring(4, 8), dateFormatter);                        
                    }
                } else {
                    return null;
                }
            }            
        });



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

Кто-нибудь может что-то посоветовать?
Спасибо.
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247168
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,

Странно, что-то не могу сходу найти масок в JavaFX.
Нужно что-то типа такого
http://myjavafx.blogspot.com/2013/05/restricting-user-input-on-textfield.html
На каждое изменение, содержимое поля надо переформатировать под маску.
Пользователь вбивает числа, а формат сам добавляет всё нужное, если его нет.
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247230
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Вот и я не смог найти иначе бы не спрашивал

Можно написать самому нечто перехватывающее KeyEvent. Подобный функционал по сути и реализовывают по вашей ссылке (и подобным - я же тоже поискал)
Код: java
1.
textProperty().addListener(new ChangeListener<String>()


Проблема в том что "нажатия кнопок" собственно в поле ввода даты я тоже не смог отыскать как отловить. Вот когда это поле покидаешь и происходит по сути ввод даты из введенного текста - это да, а на лету посмотреть изменения этого поля наподобие текстового... Ну не может быть чтоб никак, а как я что-то ни в какую...
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247244
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,

Не понял. Что не так с ChangeListener? Не надо перехватывать кнопки. Надо анализировать текущий ввод и форматировать его по маске.
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247246
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел как отловить нажатия. Cделаю конечно, но если кто-то в курсе чего-то более "нативного" буду рад подсказке.
Код: java
1.
2.
3.
myDatePicker.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
            System.out.println(": " + event.getCode());
        });


Cделаю конечно, но если кто-то в курсе чего-то более "нативного" буду рад подсказке.
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247248
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,

Ловить нажатия на кнопки - плохая затея.
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247249
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Ловить нажатия на кнопки - плохая затея.
Пользователь может вставить через буфер. Мышью.
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247252
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

На DatePicker напрямую не вешается chandeListner:( А если его вешать на valueProperty то как я и писал сработает только после ввода всей даты.
Ну или я что не так сделал;)
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247271
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все нашел гада. Его зовут Editor. Это собсвенно поле куда пользователь сам вносит данные. Дальше проще.

myDatePicker.getEditor().textProperty().addListener(new ChangeListener<String>() {

@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
System.out.println("ChangedValue" + myDatePicker.getEditor().getText());
}

});
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247272
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,

У DatePicker есть editor, который TextField. Вот туда надо попробовать повесить слушателя.
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247288
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Так и сделал все работает. Спасибо!
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247901
oneHalf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плохая идея вешать слушателя...
Надо примерно в том направлении копать:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
@Override
    public void start(Stage stage) {
        final DatePicker datePicker = new DatePicker(LocalDate.now());

        DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
        dateFormat.setLenient(false);        
        DateStringConverter converter = new DateStringConverter(dateFormat);                
        
        TextFormatter<Date> formatter = new TextFormatter<>(converter, null, c -> {
                        
            if (c.isContentChange()) {
                // auto parse
                if (c.getControlNewText().length() == 10) {
                    try {
                        dateFormat.parse(c.getControlNewText());
                    } catch (ParseException ex) {
                        c.getControl().setStyle("-fx-background-color: red;");
                    }
                }
                else{
                    c.getControl().setStyle(null);
                }
            }
            if (c.isAdded()) {
                // length restriction
                if (c.getControlNewText().length() > 10)
                {                    
                    return null;
                }
                
                // auto mask
                int caretPosition = c.getCaretPosition();
                if (caretPosition == 2 || caretPosition == 5) {
                    c.setText(c.getText() + ".");
                    c.setCaretPosition(c.getControlNewText().length());
                    c.setAnchor(c.getControlNewText().length());
                }
            }
            return c;
        });
        datePicker.getEditor().setTextFormatter(formatter);
            
        datePicker.setOnAction(event -> {
            LocalDate date = datePicker.getValue();
            System.out.println("Selected date: " + date);
        });

        stage.setScene(
                new Scene(datePicker)
        );
        stage.show();
    }
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39247909
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oneHalf,

Таки есть форматтер! Странно, что сходу не гуглится.
...
Рейтинг: 0 / 0
JavaFX: маска на полле ввода даты в элементе DatePicker
    #39272159
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oneHalf,

Спасибо!
Мое решение вообще говоря работает, но ваше мне нравится куда больше. Осуществлю "переезд":)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFX: маска на полле ввода даты в элементе DatePicker
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]