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<DatePicker, DateCell> dayCellFactory =

new Callback<DatePicker, DateCell>() {

@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<DisabledRange> 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)));

最后,您只需要检查中Callback是否在item以下范围内:

@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;");

}

...

}

以上是 javafx datepicker如何自定义 的全部内容, 来源链接: utcz.com/qa/411215.html

回到顶部