我正在尝试为JavaFX应用程序构建CalendarView,仅显示日期(不需要选择).由于DatePicker
该类有一个很好的日历弹出窗口,我想我可能会尝试提取它,以便我已经涵盖了所有的样式问题.
那么是否有一种简单的方法来提取DatePicker日历弹出窗口并将其插入到新的CalendarView中?
我已经show()
从ComboBoxBase
课堂上看过这个方法,看看当弹出窗口被触发时到底发生了什么,但我不得不承认我无法理解它.
或者,我可以考虑简单地编辑DatePicker,只有弹出窗口始终显示编辑器 - TextField和按钮组件始终隐藏,但我再也无法弄清楚如何在不隐藏弹出窗口的情况下执行此操作.另外,我可能需要让弹出窗口的边界适当地管理这个替代方案中的高度和宽度,这似乎并不那么容易.
您可以从DatePickerSkin获取DatePicker的弹出内容.有关实现,请参阅此演示:
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
是Public 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
关联的属性添加a 来监听值更改:
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); });