【问题标题】:Disable all dates not first of month or week禁用所有日期,而不是一个月或一周的第一天
【发布时间】:2018-12-03 11:08:27
【问题描述】:

我正在使用 datepicker 对象,但在尝试禁用该月的特定日期时遇到了一些麻烦。

我希望能够禁用除本月的第一天以外的每个日期,并且在另一个日期选择器上我希望能够禁用除每周的第一天(星期一)以外的所有日期,这是怎么回事完成了吗?

【问题讨论】:

  • 你可以有一个选择器,只允许用户选择月/周,然后自己指定日期

标签: java javafx datepicker


【解决方案1】:

您可以使用 DatePicker.setDayCellFactory 方法自定义 DatePicker。为了禁用某些日子,您可以执行以下操作:

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.FlowPane;
import javafx.stage.Stage;
import javafx.util.Callback;
public class DatePickerDemo extends Application {
     // Factory to create Cell of DatePicker
    private Callback<DatePicker, DateCell> disableMonday() { 
        final Callback<DatePicker, DateCell> dayCellFactory = (final DatePicker datePicker) -> new DateCell() { 
            @Override
            public void updateItem(LocalDate item, boolean empty) {
                super.updateItem(item, empty);                
                // Disable Monday
                if (item.getDayOfWeek() == DayOfWeek.MONDAY) {
                    setDisable(true);
                    setStyle("-fx-background-color: #ffc0cb;");
                }
            }
        };
        return dayCellFactory;
    }

    private Callback<DatePicker, DateCell> disableNotFirstOfMonth() { 
        final Callback<DatePicker, DateCell> dayCellFactory = (final DatePicker datePicker) -> new DateCell() { 
            @Override
            public void updateItem(LocalDate item, boolean empty) {
                super.updateItem(item, empty);                
                // Disable all except first of month
                if (item.getDayOfMonth() != 1) {
                    setDisable(true);
                    setStyle("-fx-background-color: #ffc0cb;");
                }
            }
        };
        return dayCellFactory;
    }

    @Override
    public void start(Stage stage) {

        DatePicker datePicker = new DatePicker();
        datePicker.setValue(LocalDate.now());
        datePicker.setShowWeekNumbers(true);

        DatePicker datePicker2 = new DatePicker();
        datePicker2.setValue(LocalDate.now());
        datePicker2.setShowWeekNumbers(true);

        Callback<DatePicker, DateCell> dayCellFactory  = this.disableMonday();
        Callback<DatePicker, DateCell> dayCellFactory2 = this.disableNotFirstOfMonth();
        datePicker.setDayCellFactory(dayCellFactory);
        datePicker2.setDayCellFactory(dayCellFactory2); 

        FlowPane root = new FlowPane();
        root.getChildren().add(datePicker);
        root.getChildren().add(datePicker2);
        root.setPadding(new Insets(20));

        stage.setTitle("DatePicker Demo");
        Scene scene = new Scene(root, 300, 200);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    } 
}

【讨论】:

  • 是的,但这并不能阻止我手动输入禁用日期。也许您也可以在文本字段中添加某种验证。
猜你喜欢
  • 1970-01-01
  • 2015-10-07
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多