【问题标题】:How to get the date from JFormattedTextField with a Mask如何使用掩码从 JFormattedTextField 获取日期
【发布时间】:2014-03-26 18:50:29
【问题描述】:

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

我知道我将使用MaskFormatter(因为我希望始终显示/ /)、SimpleDateFormaterDocumentListeners,所以我大部分时间都在研究这些,但不知道如何使用一切都在一起。

我有一个使用MaskFormatter("##/##/####")JFormattedTextField,我希望最终将其存储为MM/dd/yyyy 格式的日期。

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

        private MaskFormatter createFormatter(String s) {
        MaskFormatter formatter = null;
        try {
            formatter = new MaskFormatter(s);
        } catch (java.text.ParseException exc) {
            System.err.println("formatter is bad: " + exc.getMessage());
            System.exit(-1);
        }
        return formatter;
    }

这个日期反映了“星期结束日期”,在我的例子中是星期日。该日期将被发送到数据库,并且还将用于自动显示一周中其余日子的日期。比如:

如果用户输入的星期结束日期是 2014 年 3 月 30 日,那么表单上的 JLabel 将在文本“星期日”下填写为 3/30,在星期六下填写 3/29,以此类推直到周一。这就引出了我的下一个问题,减去日期。

我已经进行了研究,几乎所有地方都指向 JodaTime,但我也看到有人提到新的 Java8 JDK 解决了 Java 以前在日期方面的许多弱点。

我正在寻找关于映射/列出我想要完成的要求方面的指导,因为我感到非常混乱并且似乎无法找到足够强大的方向。我也希望对 JDK8 使用日期的方式以及它是否比 Joda 更好的选择提供任何反馈。 (我知道这里不赞成主观性,但我不知道还能问哪里。)

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

【问题讨论】:

标签: java swing date jformattedtextfield


【解决方案1】:

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

但是,如果您不想使用任何第三方库而是使用标准 Swing 组件,我建议您将 JSpinner 与日期模型一起使用。见How to Use Spinners教程。

这段代码 sn-p 应该足以让它工作:

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 APIold school 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?

【讨论】:

  • 感谢您的回答。我看到很多人在类似的问题中推荐 JSpinner。我唯一担心的是,为什么我一直在避免它,是我需要打印我正在处理的 JPanel;所以使用 JSpinner 看起来不那么干净。
  • 不客气 :) 是的,也许不会,但另一方面,输入数据会更容易。 JFormattedTextfield 非常强大(JSpinner 使用该组件)但在这种情况下,您必须非常努力地工作(解析日期、验证输入等)才能实现几乎相同的功能,并不是说用户的输入可能不像使用 JSpinner 那样简单(更不用说日期选择器,例如 JDateChooserJXDatePicker)。在一天结束时,恕我直言,用户将比丝网印刷的清洁度更欣赏数据输入的便利性。 @solleks
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2011-11-30
  • 2012-12-03
  • 1970-01-01
  • 2015-11-30
  • 2016-04-09
相关资源
最近更新 更多