Вы можете получить всплывающее содержимое DatePicker из DatePickerSkin. См. Эту демонстрацию для реализации:
public class DatePickerPopupDemo extends Application {
@Override
public void start(Stage primaryStage) {
try {
BorderPane root = new BorderPane();
Scene scene = new Scene(root, 400, 400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
DatePickerSkin datePickerSkin = new DatePickerSkin(new DatePicker(LocalDate.now()));
Node popupContent = datePickerSkin.getPopupContent();
root.setCenter(popupContent);
primaryStage.setScene(scene);
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
Если верхняя панель не нужна, вы можете посмотреть ее и скрыть .
DatePickerSkin datePickerSkin = new DatePickerSkin(new DatePicker(LocalDate.now()));
Node popupContent = datePickerSkin.getPopupContent();
// force a css layout pass to ensure that lookup calls work
popupContent.applyCss();
popupContent.lookup(".month-year-pane").setVisible(false);
root.setCenter(popupContent);
Обновление:
Начиная с JDK 9 DatePickerSkin
является частью открытого API и использует закрытая реализация com.sun.[...]
больше не требуется. (См. JavaDoc )
Кроме того, , как указано в комментариях , чтобы получить выбранное значение, вам нужно получить доступ к DatePicker
, из которого вы извлекли (например, сохраняя его как переменную).
DatePicker datePicker = new DatePicker(LocalDate.now());
DatePickerSkin datePickerSkin = new DatePickerSkin(datePicker);
Node popupContent = datePickerSkin.getPopupContent();
//[...]
LocalDate selectedDate = datePicker.getValue();
Вы также можете прослушать изменения значений, добавив ChangeListener
к соответствующему свойству:
datePicker.valueProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue extends LocalDate> observable, LocalDate oldValue, LocalDate newValue) {
System.out.println("New Value: " + newValue);
}
});
//Or using neat lambda
datePicker.valueProperty().addListener((observable, oldValue, newValue) -> {
System.out.println("New Value: " + newValue);
});
О боже, после всего этого вот ответ: необходимо включить атрибут type
в определение поля:
{
name: 'Account',
title: 'Account',
width: '10',
type: 'text',
},
{
name: 'Name',
title: 'Name',
width: '65',
type: 'text',
},
{
name: 'AXfer',
title: 'ATeam',
width: '10',
type: 'text',
},
{
name: 'BXfer',
title: 'BGood',
width: '10',
type: 'text',
}