Finally, with JavaFX 8 a DatePicker
control was added (for JavaFX 2 we had to create our own)!
The DatePicker
works well in combination with the new Java 8 Date and Time API. Those two things together provide a much better experience when working with dates in Java!
Basic Usage
Using the DatePicker is straight forward:
// Create the DatePicker. DatePicker datePicker = new DatePicker(); // Add some action (in Java 8 lambda syntax style). datePicker.setOnAction(event -> { LocalDate date = datePicker.getValue(); System.out.println("Selected date: " + date); }); // Add the DatePicker to the Stage. StackPane root = new StackPane(); root.getChildren().add(datePicker); stage.setScene(new Scene(root, 500, 650)); stage.show();
Using FXML
I usually prefer keeping as much of the view in fxml
instead of instantiating the controls in Java code as above. With Scene Builder 2.0 and above you can even drag-and-drop the DatePicker into your fxml
.
Options
Hide Week Numbers
We can set the showWeekNumbersProperty
to true/false to show/hide a column showing week numbers. Note: The default value depends on the country of the current locale.
datePicker.setShowWeekNumbers(false);
Date Converter
The date in the text field is automatically converted to the local format (in my case, it’s dd.MM.yyyy
). By setting a StringConverter
we can change this, for example, to yyyy-MM-dd
.
String pattern = "yyyy-MM-dd"; datePicker.setPromptText(pattern.toLowerCase()); datePicker.setConverter(new StringConverter<LocalDate>() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(pattern); @Override public String toString(LocalDate date) { if (date != null) { return dateFormatter.format(date); } else { return ""; } } @Override public LocalDate fromString(String string) { if (string != null && !string.isEmpty()) { return LocalDate.parse(string, dateFormatter); } else { return null; } } });
Other Calendar Systems
If you need a different chronology, e.g. the Japanese Imperial calendar system, you can change it as follows:
// Japanese calendar. datePicker.setChronology(JapaneseChronology.INSTANCE); // Hijrah calendar. datePicker.setChronology(HijrahChronology.INSTANCE); // Minguo calendar. datePicker.setChronology(MinguoChronology.INSTANCE); // Buddhist calendar. datePicker.setChronology(ThaiBuddhistChronology.INSTANCE);
Here is a screenshot of the Hijrah calendar: