从工作日开始更改 JFXDatePicker / DatePicker

问题描述

我在 JavaFX 中使用 JFXDatePicker(Material Design DatePicker),我想在单击 DatePicker 时弹出的日历中更改一周的开始日期。目前,一周的开始日期是星期日(S M T W T F S),但我想将其更改为星期一(M T W T F S S)。

这可能吗?我做了一个小调查,但没有成功。

谢谢!

解决方法

DatePicker 不支持设置 firstDayOfWeek。它(或者更好的是:它的亲属,它使用 DatePickerContent 来呈现日期网格)从应用程序默认区域设置中获取该属性。

对于任何给定的 Locale,要强制偏离默认的 firstDayOfWeek,我们可以从默认值构建一个新的 Locale,并通过扩展设置其新值:

public static Locale adjustWeekStart(Locale locale,DayOfWeek day) {
    String dayString = day.toString().substring(0,3);
    Locale weekStart = new Locale.Builder()
            .setLocale(locale)
            .setExtension(Locale.UNICODE_LOCALE_EXTENSION,"fw-" + dayString)
            .build();
    
    return weekStart;
}

注意:键“fw”在 WeekFields.of(Locale) 中指定,日期名称的前三个字母的值取自 CalendarDataUtility 的实现(如果在某处指定,请编辑;)

现在我们可以使用修改后的 Locale 作为默认值,并使用修改后的 firstDayOfWeek 获取 DatePickers:

public class DatePickerExperiments extends Application  {
    @Override
    public void start(Stage primaryStage) throws Exception {
        Locale.setDefault(adjustWeekStart(Locale.getDefault(),DayOfWeek.SATURDAY));
        
        DatePicker datePicker = new DatePicker();
        Scene scene = new Scene(new HBox(datePicker),300,240);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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