Я хочу ввести пользовательский формат DatePicker в Javafx8. Если я вхожу, например. "21,2,15" по textinput Я хочу, чтобы сборщик дат установил localdate до 21 февраля 2015 года. Я мог бы разделить строку на три части и просто добавить три INT в новую локальную дату, но как я могу получить доступ к моему входному тексту до/во время входа? Вторая возможность: поймать запятую (,) и мгновенно преобразовать ее в точку (.), Поэтому, набрав «21,2,15», она преобразуется в «21.2.15» и в этом формате после нажатия ввода добавляет DatePicker 2015-02-21 как местная дата. Итак, любой шанс ввести дату с помощью «d, m, yy»?Пользовательский ввод текста ввода даты запятой
ответ
Укажите converter
для DatePicker
и используйте подходящий DateTimeFormatter
, чтобы разобрать и отформатировать дату.
SSCEE:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.DatePicker;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.StringConverter;
public class DatePickerWithCustomFormat extends Application {
@Override
public void start(Stage primaryStage) {
DatePicker datePicker = new DatePicker();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d,M,y");
datePicker.setConverter(new StringConverter<LocalDate>() {
@Override
public String toString(LocalDate date) {
if (date == null) {
return "" ;
}
return formatter.format(date);
}
@Override
public LocalDate fromString(String string) {
if (string == null || string.isEmpty()) {
return null ;
}
return LocalDate.from(formatter.parse(string));
}
});
datePicker.valueProperty().addListener((obs, oldDate, newDate) ->
System.out.println("Selected "+newDate));
primaryStage.setScene(new Scene(new StackPane(datePicker), 375, 120));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
спасибо, друг. Вхождение этого шаблона работает как шарм. Теперь Picker должен показывать LocalDate с точками после ввода с запятой. поэтому (набрав 30,12,13) -> (нажмите enter) -> (localdate - 2013-12-30-работает, спасибо -) -> (datepicker должен ПОКАЗАТЬ 30.12.13). Было бы идеально, если бы я мог набирать 30.12.13 или 30,12,13, и в обоих случаях localdate будет на 2013-12-30, а текст, показанный в DatePicker, будет 30.12.13. Вы понимаете, что я имею в виду? – Simsala
На TextField, это будет работать, но я использую DatePicker. Спасибо в любом случае – Simsala