我刚开始使用新的
JavaFX 8控件DatePicker.在
DatePicker User Experience Documentation中,它声称它有我想在GUI应用程序中使用的一些很酷的功能:
>我想将格式从mm / dd / yyyy更改为dd / mm / yyyy.
>我想限制可以选择的日期.用户只能从今天开始选择,直到明年的同一天.
>显示除原始日期之外的Hijri日期:
如何实现这些功能? JavaDoc并没有对它们说太多.
解决方法
这是完整的实现:
- import java.net.URL;
- import java.time.LocalDate;
- import java.time.chrono.HijrahChronology;
- import java.time.format.DateTimeFormatter;
- import java.util.ResourceBundle;
- import javafx.application.Platform;
- import javafx.fxml.FXML;
- import javafx.fxml.Initializable;
- import javafx.scene.control.DateCell;
- import javafx.scene.control.DatePicker;
- import javafx.scene.control.Label;
- import javafx.scene.input.MouseEvent;
- import javafx.util.Callback;
- import javafx.util.StringConverter;
- /**
- *
- * @author Fouad
- */
- public class FXMLDocumentController implements Initializable
- {
- @FXML
- private DatePicker dpDate;
- @Override
- public void initialize(URL url,ResourceBundle rb)
- {
- dpDate.setValue(LocalDate.now());
- dpDate.setChronology(HijrahChronology.INSTANCE);
- Callback<DatePicker,DateCell> dayCellFactory = dp -> new DateCell()
- {
- @Override
- public void updateItem(LocalDate item,boolean empty)
- {
- super.updateItem(item,empty);
- if(item.isBefore(LocalDate.now()) || item.isAfter(LocalDate.now().plusYears(1)))
- {
- setStyle("-fx-background-color: #ffc0cb;");
- Platform.runLater(() -> setDisable(true));
- /* When Hijri Dates are shown,setDisable() doesn't work. Here is a workaround */
- //addEventFilter(MouseEvent.MOUSE_CLICKED,e -> e.consume());
- }
- }
- };
- StringConverter<LocalDate> converter = new StringConverter<LocalDate>()
- {
- final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
- @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())
- {
- LocalDate date = LocalDate.parse(string,dateFormatter);
- if(date.isBefore(LocalDate.now()) || date.isAfter(LocalDate.now().plusYears(1)))
- {
- return dpDate.getValue();
- }
- else return date;
- }
- else return null;
- }
- };
- dpDate.setDayCellFactory(dayCellFactory);
- dpDate.setConverter(converter);
- dpDate.setPromptText("dd/MM/yyyy");
- }
- }