在JavaFX的DatePicker中设置一周的第一天

Eng*_*uad 5 java javafx arabic java-time javafx-datepicker

应用阿拉伯语语言环境时,是否可以在JavaFX的DatePicker上更改星期的第一天?我需要从星期六到星期日改变它.

在此输入图像描述

Eng*_*uad 5

通过在我的应用程序中注入以下类,我能够更改一周的第一个日期:

package sun.util.resources.ar;

import sun.util.resources.LocaleNamesBundle;

public final class CalendarData_ar_SA extends LocaleNamesBundle
{
    protected final Object[][] getContents()
    {
        return new Object[][] { { "firstDayOfWeek", "1" }, { "minimalDaysInFirstWeek", "1" } };
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


不要忘记更改默认语言环境:

public static final Locale SAUDI_AR_LOCALE = new Locale.Builder().setLanguageTag("ar-SA-u-nu-arab").build(); // nu is for numbers

// ....

Locale.setDefault(SAUDI_AR_LOCALE);
Run Code Online (Sandbox Code Playgroud)

编辑:

先前的解决方案不适用于 Java 8 (u152) 的最新更新。实现这一目标的正确方法是使用称为“区域设置敏感服务提供商”的东西。

首先,创建CalendarDataProvider的自定义实现:

package io.fouad.utils;

import java.time.DayOfWeek;
import java.util.Locale;
import java.util.spi.CalendarDataProvider;

public class ArabicCalendarDataProvider extends CalendarDataProvider
{
    private static final DayOfWeek FIRST_DAY_OF_WEEK = DayOfWeek.SUNDAY;

    @Override
    public int getFirstDayOfWeek(Locale locale)
    {
        return (FIRST_DAY_OF_WEEK.getValue() + 1) % 7;
    }

    @Override
    public int getMinimalDaysInFirstWeek(Locale locale)
    {
        return 1;
    }

    @Override
    public Locale[] getAvailableLocales()
    {
        return new Locale[]{new Locale("ar", "SA")};
    }

    @Override
    public boolean isSupportedLocale(Locale locale)
    {
        return locale != null && "ar".equals(locale.getLanguage()) && "SA".equals(locale.getCountry());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后创建一个jar文件并打包ArabicCalendarDataProvider为服务提供者。即 jar 文件将包含以下文件:

META-INF/services/java.util.spi.CalendarDataProvider io/fouad/utils/ArabicCalendarDataProvider.class

该文件java.util.spi.CalendarDataProvider包含以下行:

io.foad.utils.ArabicCalendarDataProvider

现在,为了使其工作,您需要将此 jar 作为扩展安装,方法是将 jar 放入默认扩展目录或在启动时传递以下 JVM 参数:

-Djava.ext.dirs=path/to/the/folder/that/contains/the/jar

请注意,在 Java 9 中,如果 jar 位于应用程序的类路径上,则区域设置敏感的服务实现将直接工作。

最后,您需要修改应用程序中使用的语言环境提供程序的顺序。即传递以下JVM参数:

-Djava.locale.providers=SPI,CLDR,JRE,HOST

SPI 应该是第一。

您可以按如下方式进行测试:

DayOfWeek firstDayOfWeek = WeekFields.of(new Locale("ar", "SA")).getFirstDayOfWeek();
System.out.println("firstDayOfWeek = " + firstDayOfWeek);
Run Code Online (Sandbox Code Playgroud)

在默认行为中,输出将是:

firstDayOfWeek = 星期六

当应用自定义语言环境提供者并将其SPI作为第一个时,输出将是:

firstDayOfWeek = 星期日

看: