gpt4 book ai didi

JavaFX 从 DatePicker 中提取日历弹出窗口/仅显示弹出窗口

转载 作者:行者123 更新时间:2023-12-04 00:32:26 25 4
gpt4 key购买 nike

我正在尝试为 JavaFX 应用程序构建 CalendarView,仅显示日期(无需选择)。由于DatePicker class 有一个不错的日历弹出窗口,我想我可能会尝试提取它,以便我已经涵盖了所有样式问题。

那么有没有一种简单的方法来提取 DatePicker 日历弹出窗口并将其插入到新的 CalendarView 中?

我已经看过 show()来自 ComboBoxBase 的方法上课看看触发弹出窗口时到底发生了什么,但我不得不承认我无法真正理解它。

或者,我可以考虑简单地编辑 DatePicker,使只有弹出窗口始终显示,而编辑器文本字段和按钮组件总是隐藏,但我还是不知道如何在不隐藏弹出窗口的情况下做到这一点.此外,我可能需要让弹出窗口的边界来适本地管理这个alternativw中的高度和宽度,这似乎又不是那么容易。

最佳答案

您可以从 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);
}
}

popup content

如果不需要顶栏,您可以查找并隐藏它。
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);

popup content with hidden top bar

更新:

从 JDK 9 开始 DatePickerSkin是公共(public) API 的一部分并使用封闭的 com.sun.[...]不再需要实现。 (见 JavaDoc)

另外, as mentioned in the comments , 要获得所选值,您必须访问 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<LocalDate>() {
@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);
});

关于JavaFX 从 DatePicker 中提取日历弹出窗口/仅显示弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34681975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com