【问题标题】:Allow user to only select Mondays in DatePicker允许用户在 DatePicker 中仅选择星期一
【发布时间】:2016-04-03 22:27:13
【问题描述】:

我正在处理一个 javafx 项目,并且我已经包含了一个 DatePicker。我想让用户只能选择星期一

DatePicker startDate = new DatePicker();

如果可能的话,有什么想法吗?

【问题讨论】:

    标签: javafx datepicker


    【解决方案1】:

    你需要做两件事:

    1. 如果用户将文本字段中的日期更改为非星期一的日期,则否决更改。您可以使用 converter property 的 DatePicker 来做到这一点。
    2. 禁用弹出窗口中非星期一的所有单元格。您可以使用dayCellFactory 来完成此操作。

    简单示例:

    import java.time.DayOfWeek;
    import java.time.LocalDate;
    
    import javafx.application.Application;
    import javafx.geometry.Insets;
    import javafx.scene.Scene;
    import javafx.scene.control.DateCell;
    import javafx.scene.control.DatePicker;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    import javafx.util.Callback;
    import javafx.util.StringConverter;
    
    public class DatePickerMondaysOnly extends Application {
    
        @Override
        public void start(Stage primaryStage) {
    
            DatePicker datePicker = new DatePicker();
    
            StringConverter<LocalDate> defaultConverter = datePicker.getConverter();
    
            datePicker.setConverter(new StringConverter<LocalDate>() {
    
                @Override
                public String toString(LocalDate object) {
                    return defaultConverter.toString(object);
                }
    
                @Override
                public LocalDate fromString(String string) {
                    LocalDate date = defaultConverter.fromString(string);
                    if (date.getDayOfWeek() == DayOfWeek.MONDAY) {
                        return date ;
                    } else {
                        // not a Monday. Revert to previous value.
                        // You could also, e.g., return the closest Monday here.
                        return datePicker.getValue();
                    }
                }
    
            });
    
            datePicker.setDayCellFactory(dp -> new DateCell() {
                @Override
                public void updateItem(LocalDate item, boolean empty) {
                    super.updateItem(item, empty);
                    setDisable(empty || item.getDayOfWeek() != DayOfWeek.MONDAY);               
                }
            });
    
            // Just for debugging: make sure we only see Mondays:
            datePicker.valueProperty().addListener((obs, oldDate, newDate) -> {
                if (newDate.getDayOfWeek() != DayOfWeek.MONDAY) {
                    System.out.println("WARNING: date chosen was not a Monday");
                }
                System.out.println(newDate + " (" + newDate.getDayOfWeek()+")");
            });
    
            StackPane root = new StackPane(datePicker);
            root.setPadding(new Insets(20));
            primaryStage.setScene(new Scene(root));
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    【讨论】:

    • 这真的帮助并解决了我的问题,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多