Если вы отметите класс DatePickerContent
, вы обнаружите, что каждый раз, когда создается новый DateCell
, к нему добавляется EventHandler
типа MOUSE_CLICKED
. Этот обработчик будет вызывать selectDayCell(DateCell)
, когда пользователь нажимает на ячейку. selectDayCell(DateCell)
устанавливает новое значение даты и скрывает DatePicker
:
protected void createDayCells() {
final EventHandler<MouseEvent> dayCellActionHandler = ev -> {
if (ev.getButton() != MouseButton.PRIMARY) {
return;
}
DateCell dayCell = (DateCell)ev.getSource();
selectDayCell(dayCell);
lastFocusedDayCell = dayCell;
};
for (int row = 0; row < 6; row++) {
for (int col = 0; col < daysPerWeek; col++) {
DateCell dayCell = createDayCell();
dayCell.addEventHandler(MouseEvent.MOUSE_CLICKED, dayCellActionHandler);
dayCells.add(dayCell);
}
}
dayCellDates = new LocalDate[6 * daysPerWeek];
}
public void selectDayCell(DateCell dateCell) {
datePicker.setValue(dayCellDate(dateCell));
datePicker.hide();
}
Если вы используете Java 9 или новее, вы можете расширить класс DatePickerContent
и переопределить метод selectDayCell(DateCell)
чтобы не скрыть DatePicker
после выбора ячейки:
public void selectDayCell(DateCell dateCell) {
datePicker.setValue(dayCellDate(dateCell));
}
К сожалению, в Java 8, DatePickerContent
имеет конструктор частного пакета, поэтому вы не можете расширять его. В качестве обходного пути вы можете добавить еще один EventHandler
по щелчку мыши, который будет снова показывать DatePicker
после нажатия на ячейку:
EventHandler<MouseEvent> mouseClickedEventHandler = clickEvent -> {
if (clickEvent.getButton() == MouseButton.PRIMARY) {
datePicker.show();
}
clickEvent.consume();
};
На фабрике вашей ячейки:
@Override
public void updateItem(LocalDate item, boolean empty) {
super.updateItem(item, empty);
//...
if (item != null && !empty) {
//...
addEventHandler(MouseEvent.MOUSE_CLICKED, mouseClickedEventHandler);
} else {
//...
removeEventHandler(MouseEvent.MOUSE_CLICKED, mouseClickedEventHandler);
}
}