javafx datepicker如何自定义

我有日期选择器的简单代码,它禁用所选日期之前的所有日期,但我也需要能够禁用其他日期(例如:2014年10月17日至2014年10月19日)。我怎么能以特定日期也被禁用的方式更改它?

公共类DatePickerSample扩展Application {

private Stage stage; private DatePicker checkInDatePicker; private DatePicker checkOutDatePicker; public static void main(String[] args) { Locale.setDefault(Locale.US); launch(args); } @Override public void start(Stage stage) { this.stage = stage; stage.setTitle("DatePickerSample "); initUI(); stage.show(); } private void initUI() { VBox vbox = new VBox(20); vbox.setStyle("-fx-padding: 10;"); Scene scene = new Scene(vbox, 400, 400); stage.setScene(scene); checkInDatePicker = new DatePicker(); checkOutDatePicker = new DatePicker(); checkInDatePicker.setValue(LocalDate.now()); final Callback dayCellFactory = new Callback() { @Override public DateCell call(final DatePicker datePicker) { return new DateCell() { @Override public void updateItem(LocalDate item, boolean empty) { super.updateItem(item, empty); if (item.isBefore( checkInDatePicker.getValue().plusDays(1)) ) { setDisable(true); setStyle("-fx-background-color: #ffc0cb;"); } long p = ChronoUnit.DAYS.between( checkInDatePicker.getValue(), item ); setTooltip(new Tooltip( "You're about to stay for " + p + " days") ); } }; } }; checkOutDatePicker.setDayCellFactory(dayCellFactory); checkOutDatePicker.setValue(checkInDatePicker.getValue().plusDays(1)); GridPane gridPane = new GridPane(); gridPane.setHgap(10); gridPane.setVgap(10); Label checkInlabel = new Label("Check-In Date:"); gridPane.add(checkInlabel, 0, 0); GridPane.setHalignment(checkInlabel, HPos.LEFT); gridPane.add(checkInDatePicker, 0, 1); Label checkOutlabel = new Label("Check-Out Date:"); gridPane.add(checkOutlabel, 0, 2); GridPane.setHalignment(checkOutlabel, HPos.LEFT); gridPane.add(checkOutDatePicker, 0, 3); vbox.getChildren().add(gridPane); } 

}

如果要禁用多个日期范围,可以创建此POJO:

 class DisabledRange { private final LocalDate initialDate; private final LocalDate endDate; public DisabledRange(LocalDate initialDate, LocalDate endDate){ this.initialDate=initialDate; this.endDate = endDate; } public LocalDate getInitialDate() { return initialDate; } public LocalDate getEndDate() { return endDate; } } 

现在,您可以在日历中定义要禁用的范围集合。 例如:

 private final ObservableList rangesToDisable = FXCollections.observableArrayList( new DisabledRange(LocalDate.of(2014,10,17), LocalDate.of(2014,10,19)), new DisabledRange(LocalDate.of(2014,10,27), LocalDate.of(2014,10,29))); 

最后,如果item在以下任何范围内,您只需要检入Callback

 @Override public void updateItem(LocalDate item, boolean empty) { super.updateItem(item, empty); boolean disable = rangesToDisable.stream() .filter(r->r.initialDate.minusDays(1).isBefore(item)) .filter(r->r.endDate.plusDays(1).isAfter(item)) .findAny() .isPresent(); if (item.isBefore(checkInDatePicker.getValue().plusDays(1)) || disable) { setDisable(true); setStyle("-fx-background-color: #ffc0cb;"); } ... }