【问题标题】:Change first-day-of-week for a Vaadin DateField or InlineDateField更改 Vaadin DateField 或 InlineDateField 的第一天
【发布时间】:2014-07-30 00:09:49
【问题描述】:

如何在 Vaadin 日历小部件DateField 和InlineDateField 中更改一周的第一天?例如,在上面的屏幕截图中,一周从星期日开始,但我想要星期一。

我知道这些小部件尊重区域设置,并进行相应调整。例如,分配 Locale.FRANCE 给我星期一作为一周的第一天(和法语作为月份和日期的名称),而 Locale.CANADA_FRENCH 给我星期日作为一周的第一天。

但是有什么方法可以专门设置一周的第一天吗?在我的情况下,我希望用户选择区域设置,但日历特别必须将星期一作为一周的第一天才能呈现标准 ISO 8601 weeks。

【问题讨论】:

  • 仅作记录:您不能通过使用setShowISOWeekNumbers(true) 以这种行为欺骗组件;使用Locale.US,如果语言环境的周不是从星期一开始,则根本不会显示数字。

标签: java vaadin vaadin7 datefield


【解决方案1】:

您可以操作 UI 的区域设置数据缓存。例如:

class AppUI extends UI {
    @Override
    protected void init(VaadinRequest vaadinRequest) {
        state.localeServiceState.localeData*.firstDayOfWeek = 1
    }
}

请注意,localeData 列表将随着新的语言环境而改变,您可以让 vaadin 在运行时知道。您可能需要确保事先用您已知的列表填写此列表,或者找到对更改做出反应的方法。

【讨论】:

  • 您能提供更多解释吗?我还没有听说过这种状态或缓存。我想我们大多数人都没有。 state 是指getState 访问UIState 对象吗?我没有看到任何 state 字段。
  • 有没有办法只为一个小部件执行此操作,例如 inlineDateField?我在 TextualDateFieldState 类上看不到语言环境状态。
  • 是的,它是来自 UI 的 getState()。上面的代码很时髦。基本上它正在调用 setFirstDayOfWeek(1) 到 localeData 中的每个条目(将 get.* 添加到那里的所有项目)。不,这个解决方案是顽固地摆弄vaadin的胆量。由于日期字段的类层次结构,我还没有看到一种将其限制为一个字段的简单方法。您可以尝试在客户端操纵 DateTimeService dts 字段(免责声明:随机猜测)
【解决方案2】:

如果您的 UI 区域设置必须是一个,但您希望日期表示在日期字段中是另一个,您可以使用 dateField.setLocale(Locale.FRANCE); 覆盖日期字段中的区域设置。据我所知,没有具体设置第一天的选项。

【讨论】:

    【解决方案3】:

    解决方法:使用相同语言分配另一个区域设置

    正如answer by Jens Jansson 中提到的,我们可以设置特定小部件的区域设置以覆盖使用 UI 区域设置的默认设置。

    我已将该功能用作 hack,用于解决这个问题的解决方法。

    假设您想使用Locale.CANADA 作为您的应用程序的语言环境。但是该语言环境使用星期日作为一周的第一天,而我们想要星期一。也许我们想要 InlineDateField 中的一年中的一周功能。我们可以为该 InlineDateField 分配另一个使用星期一的英语语言环境,例如 Locale.UK,其中星期一是一周的第一天。对于法语转折,如果我们通常使用Locale.CANADA_FRENCH,我们可以将Locale.FRANCE 分配给小部件,其中星期一而不是星期日首先出现。

    不理想,但我一直在成功使用这种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多