当前位置: 首页 > 面试题库 >

javafx datepicker如何自定义

宋斌
2023-03-14
问题内容

我有简单的日期选择器代码,它可以禁用所有比选定日期更早的日期,但是我还需要能够禁用其他日期(例如:2014年10月17日至2014年10月19日)。以也禁用特定日期的方式更改它吗?

公共类DatePickerSample扩展了Application {

private Stage stage;
private DatePicker checkInDatePicker;
private DatePicker checkOutDatePicker;

public static void main(String[] args) {
    Locale.setDefault(Locale.US);                  
    launch(args);
}

@Override
public void start(Stage stage) {
    this.stage = stage;
    stage.setTitle("DatePickerSample ");
    initUI();
    stage.show();
}

private void initUI() {
    VBox vbox = new VBox(20);
    vbox.setStyle("-fx-padding: 10;");
    Scene scene = new Scene(vbox, 400, 400);
    stage.setScene(scene);
    checkInDatePicker = new DatePicker();
    checkOutDatePicker = new DatePicker();
    checkInDatePicker.setValue(LocalDate.now());
    final Callback<DatePicker, DateCell> dayCellFactory = 
        new Callback<DatePicker, DateCell>() {
            @Override
            public DateCell call(final DatePicker datePicker) {
                return new DateCell() {
                    @Override
                    public void updateItem(LocalDate item, boolean empty) {
                        super.updateItem(item, empty);
                        if (item.isBefore(
                                checkInDatePicker.getValue().plusDays(1))
                            ) {
                                setDisable(true);
                                setStyle("-fx-background-color: #ffc0cb;");
                        }
                        long p = ChronoUnit.DAYS.between(
                                checkInDatePicker.getValue(), item
                        );
                        setTooltip(new Tooltip(
                            "You're about to stay for " + p + " days")
                        );
                }
            };
        }
    };
    checkOutDatePicker.setDayCellFactory(dayCellFactory);
    checkOutDatePicker.setValue(checkInDatePicker.getValue().plusDays(1));
    GridPane gridPane = new GridPane();

    gridPane.setHgap(10);
    gridPane.setVgap(10);
    Label checkInlabel = new Label("Check-In Date:");
    gridPane.add(checkInlabel, 0, 0);
    GridPane.setHalignment(checkInlabel, HPos.LEFT);
    gridPane.add(checkInDatePicker, 0, 1);
    Label checkOutlabel = new Label("Check-Out Date:");
    gridPane.add(checkOutlabel, 0, 2);
    GridPane.setHalignment(checkOutlabel, HPos.LEFT);
    gridPane.add(checkOutDatePicker, 0, 3);
    vbox.getChildren().add(gridPane);
}

}


问题答案:

如果要禁用多个日期范围,则可以创建以下POJO:

class DisabledRange {

    private final LocalDate initialDate;
    private final LocalDate endDate;

    public DisabledRange(LocalDate initialDate, LocalDate endDate){
        this.initialDate=initialDate;
        this.endDate = endDate;
    }

    public LocalDate getInitialDate() { return initialDate; }
    public LocalDate getEndDate() { return endDate; }

}

现在,您可以定义要在日历中禁用的范围的集合。例如:

private final ObservableList<DisabledRange> rangesToDisable = 
    FXCollections.observableArrayList(
        new DisabledRange(LocalDate.of(2014,10,17), LocalDate.of(2014,10,19)),
        new DisabledRange(LocalDate.of(2014,10,27), LocalDate.of(2014,10,29)));

最后,您只需要检查中Callback是否在item以下范围内:

@Override
public void updateItem(LocalDate item, boolean empty) {
    super.updateItem(item, empty);

    boolean disable = rangesToDisable.stream()
            .filter(r->r.initialDate.minusDays(1).isBefore(item))
            .filter(r->r.endDate.plusDays(1).isAfter(item))
            .findAny()
            .isPresent();

    if (item.isBefore(checkInDatePicker.getValue().plusDays(1)) || 
            disable) {
            setDisable(true);
            setStyle("-fx-background-color: #ffc0cb;");
    }
    ...
}


 类似资料:
  • 主要内容:前记,1.自定义视图,2.自定义异常,3.自定义异常的原理前记 在前面的文章中, 表示了视图解析的原理和异常解析器的解析原理。 这篇通过如何自定义视图和自定义异常处理和自定义异常处理的原理进行说明。 这里说明一下, 自定义的视图和自定义的异常都是会代替容器默认的组件的, 异常还好说, 就是不符合就抛, 视图的话需要注意一下优先级, 可以在自定义的视图解析器上加上注解。 1.自定义视图 这里原理就是添加一个视图和视图解析器, 然后放入容器中, 最后访问相应

  • 问题内容: 我想使用ModelMapper将实体转换为DTO并返回。通常,它可以工作,但是如何自定义它。它有太多选择,因此很难弄清楚从哪里开始。最佳做法是什么? 我会在下面亲自回答,但如果另一个答案更好,我会接受。 问题答案: 首先这是一些链接 modelmapper入门 API文档 博客文章 随机代码示例 我对mm的印象是它的设计很好。该代码很扎实,阅读起来很愉快。但是,该文档非常简洁,仅包含很

  • 本文向大家介绍如何自定义filter?相关面试题,主要包含被问及如何自定义filter?时的应答技巧和注意事项,需要的朋友参考一下 在模块下挂在一个filter()方法,第一个参数传入过滤器的名字,第二个参数是回调函数,处理过滤方法的详细内容,最后返回结果,这样外部就可以根据过滤器的名字调用了

  • 我想创建一个自定义的矩形进度条与白色背景色。进度条中有一个文本居中,用于定义进度条的高度。还有另一个黑色背景色的视图,其宽度从左侧开始增长,具体取决于进度。我有这个,但不起作用: 编辑:好的,我有这个: 唯一的问题是:如何告诉LinearLayout与TextView一样高?

  • 我有多个web api项目(微服务),我想只使用一个swagger-ui链接来公开它们。为了撰写本文,我将每个web api项目称为EndpointA和EndpointB。 我创建了一个swagger-ui项目,并将每个endpoint添加到该项目中。 我的swagger-ui项目 我还尝试使用直接在每个endpoint中设置前缀,但我不知道如何设置。

  • 问题内容: 我们使用log4j 1.2.x登录我们的产品,并希望在不久的将来迁移到log4j2.x。我们已实现的功能之一是将系统信息和其他重要参数记录在生成的每个新翻转日志文件上。在log4j 1.2.x中实现的方式是扩展了log4j类并覆盖了该方法,下面是实现的部分代码段 现在,当我们要迁移到log4j2时,我们正在寻找一种实现相同功能的新解决方案。但是,正如我看到的log4j2的源代码与旧的源