如何使用Mask从JFormattedTextField获取日期

时间:2014-03-26 18:50:29

标签: java swing date jformattedtextfield

我花了很多时间阅读Java文档和相关问题,但仍然无法准确理解我需要做些什么才能完成我想要的工作。

我知道我将使用MaskFormatter(因为我希望始终显示/ /),SimpleDateFormaterDocumentListeners因此我花了大部分时间研究这些但是无法弄清楚如何一起使用所有东西。

我有JFormattedTextField使用MaskFormatter("##/##/####"),我希望最终以[{1}}格式存储为日期。

MM/dd/yyyy

    private JFormattedTextField weekEndingData = new JFormattedTextField(createFormatter("##/##/####"));
    private String dateString = weekEndingData.toString();
    private SimpleDateFormat dateFormatter = new SimpleDateFormat("MM/dd/yyyy");

此日期反映了"周结束日期"在我的情况下,这是星期天。此日期将发送到数据库,还将用于自动显示一周中其余日期的日期。例如:

如果用户输入的周结束日期是2014年3月30日,则表单上的JLabel将在文本"星期日"和星期六3/29下填写为3/30等等,直到星期一。这让我想到了下一期,减去日期。

我已经完成了研究,几乎无处不在JodaTime,但我也看到有人提到新的Java8 JDK在日期方面解决了Java以前的许多弱点。

我正在寻找关于绘制/列出我对我想要完成的要求的指导,因为我觉得非常混乱,似乎找不到足够强大的方向。我也希望有关JDK8使用日期的方式的任何反馈,以及它是否比Joda更好的选择。 (我知道主观性在这里不受欢迎,但我不知道还能在哪里问。)

编辑可视化可能有所帮助。这个面板将被打印,因此JSpinner是不利的。黄色只是暂时帮助我可视化空间分布。 this

1 个答案:

答案 0 :(得分:4)

有更好的选择允许用户在Swing中输入日期,但在第三方库中:

但是,如果您不想使用任何第三方库,而是使用标准的Swing组件,我建议您使用JSpinner和日期模型。请参阅How to Use Spinners教程。

此代码段应足以使其正常工作:

SpinnerDateModel model = new SpinnerDateModel();
JSpinner spinner = new JSpinner(model);

JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "MM/dd/yyyy");
DateFormatter formatter = (DateFormatter)editor.getTextField().getFormatter();
formatter.setAllowsInvalid(false);
formatter.setOverwriteMode(true);

spinner.setEditor(editor);

为了诚实地处理日期,我还没有尝试过Java 8,但是还有一个正式的路径:Trail: Date Time

如果您不想使用新API,则可以使用Calendar API旧学校 API)。例如:

Date date = (Date)spinner.getModel().getValue();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
if(calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
    System.out.println("Today is Sunday!");
}

如果您想减去一天,您可以执行以下操作:

calendar.add(Calendar.DAY_OF_MONTH, -1);

这个问题也有很好的答案:How can I increment a date by one day in Java?