modules/controls/src/main/java/javafx/scene/control/DatePicker.java
Print this page
rev 7619 : RT-38011: StringConverter support for LocalDate/LocalTime/LocalDateTime
*** 30,44 ****
import java.time.LocalDate;
import java.time.DateTimeException;
import java.time.chrono.Chronology;
import java.time.chrono.ChronoLocalDate;
import java.time.chrono.IsoChronology;
- import java.time.format.DateTimeFormatter;
- import java.time.format.DateTimeFormatterBuilder;
- import java.time.format.DecimalStyle;
import java.time.format.FormatStyle;
- import java.time.temporal.TemporalAccessor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
--- 30,40 ----
*** 56,65 ****
--- 52,62 ----
import javafx.css.StyleableProperty;
import javafx.scene.AccessibleAttribute;
import javafx.scene.AccessibleRole;
import javafx.util.Callback;
import javafx.util.StringConverter;
+ import javafx.util.converter.LocalDateStringConverter;
import com.sun.javafx.css.converters.BooleanConverter;
import com.sun.javafx.scene.control.skin.DatePickerSkin;
import com.sun.javafx.scene.control.skin.resources.ControlResources;
*** 134,143 ****
--- 131,141 ----
LocalDate date = getValue();
Chronology chrono = getChronology();
if (validateDate(chrono, date)) {
lastValidChronology = chrono;
+ defaultConverter = new LocalDateStringConverter(FormatStyle.SHORT, null, chrono);
} else {
System.err.println("Restoring value to " + lastValidChronology);
setChronology(lastValidChronology);
}
});
*** 302,312 ****
/**
* Converts the input text to an object of type LocalDate and vice
* versa.
*
* <p>If not set by the application, the DatePicker skin class will
! * set a converter based on a {@link java.time.DateTimeFormatter}
* for the current {@link java.util.Locale} and
* {@link #chronologyProperty() chronology}. This formatter is
* then used to parse and display the current date value.
*
* Setting the value to <code>null</code> will restore the default
--- 300,310 ----
/**
* Converts the input text to an object of type LocalDate and vice
* versa.
*
* <p>If not set by the application, the DatePicker skin class will
! * set a converter based on a {@link java.time.format.DateTimeFormatter}
* for the current {@link java.util.Locale} and
* {@link #chronologyProperty() chronology}. This formatter is
* then used to parse and display the current date value.
*
* Setting the value to <code>null</code> will restore the default
*** 400,467 ****
} else {
return defaultConverter;
}
}
! private StringConverter<LocalDate> defaultConverter = new StringConverter<LocalDate>() {
! @Override public String toString(LocalDate value) {
! if (value != null) {
! Locale locale = Locale.getDefault(Locale.Category.FORMAT);
! Chronology chrono = getChronology();
! ChronoLocalDate cDate;
! try {
! cDate = chrono.date(value);
! } catch (DateTimeException ex) {
! System.err.println(ex);
! chrono = IsoChronology.INSTANCE;
! cDate = value;
! }
! DateTimeFormatter dateFormatter =
! DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
! .withLocale(locale)
! .withChronology(chrono)
! .withDecimalStyle(DecimalStyle.of(locale));
!
! String pattern =
! DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT,
! null, chrono, locale);
!
! if (pattern.contains("yy") && !pattern.contains("yyy")) {
! // Modify pattern to show four-digit year, including leading zeros.
! String newPattern = pattern.replace("yy", "yyyy");
! //System.err.println("Fixing pattern ("+forParsing+"): "+pattern+" -> "+newPattern);
! dateFormatter = DateTimeFormatter.ofPattern(newPattern)
! .withDecimalStyle(DecimalStyle.of(locale));
! }
!
! return dateFormatter.format(cDate);
! } else {
! return "";
! }
! }
!
! @Override public LocalDate fromString(String text) {
! if (text != null && !text.isEmpty()) {
! Locale locale = Locale.getDefault(Locale.Category.FORMAT);
! Chronology chrono = getChronology();
!
! String pattern =
! DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT,
! null, chrono, locale);
! DateTimeFormatter df =
! new DateTimeFormatterBuilder().parseLenient()
! .appendPattern(pattern)
! .toFormatter()
! .withChronology(chrono)
! .withDecimalStyle(DecimalStyle.of(locale));
! TemporalAccessor temporal = df.parse(text);
! ChronoLocalDate cDate = chrono.date(temporal);
! return LocalDate.from(cDate);
! }
! return null;
! }
! };
// --- Editor
/**
* The editor for the DatePicker.
--- 398,410 ----
} else {
return defaultConverter;
}
}
! // Create a symmetric (format/parse) converter with the default locale.
! private StringConverter<LocalDate> defaultConverter =
! new LocalDateStringConverter(FormatStyle.SHORT, null, getChronology());
// --- Editor
/**
* The editor for the DatePicker.