Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFX: маска на полле ввода даты в элементе DatePicker / 14 сообщений из 14, страница 1 из 1
31.05.2016, 13:45
    #39247159
RuslanGab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX: маска на полле ввода даты в элементе DatePicker
Господа, кто знает как реализовать ввод даты пс маской?
Имеется ввиду следующее:
пользователь ввел "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
31.05.2016, 13:52
    #39247168
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX: маска на полле ввода даты в элементе DatePicker
RuslanGab,

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

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

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


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

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


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

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

На DatePicker напрямую не вешается chandeListner:( А если его вешать на valueProperty то как я и писал сработает только после ввода всей даты.
Ну или я что не так сделал;)
...
Рейтинг: 0 / 0
31.05.2016, 15:10
    #39247271
RuslanGab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX: маска на полле ввода даты в элементе DatePicker
Все нашел гада. Его зовут 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
31.05.2016, 15:10
    #39247272
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX: маска на полле ввода даты в элементе DatePicker
RuslanGab,

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

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

Код: 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
01.06.2016, 11:21
    #39247909
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX: маска на полле ввода даты в элементе DatePicker
oneHalf,

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

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


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