java - 如何使用 Mask 从 JFormattedTextField 获取日期

标签 java swing date jformattedtextfield

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

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

我有一个 JFormattedTextField,它使用了一个 MaskFormatter("##/##/####"),我希望最终将其存储为日期格式为 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;
    }

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

如果用户输入的星期结束日期是 3/30/2014,那么表单上的 JLabel 将在文本“Sunday”下填写 3/30,在 Saturday 下填写 3/29,依此类推直到周一。这让我想到下一期,减去日期。

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

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

EDIT 可视化可能会有所帮助。将打印此面板,因此 JSpinner 是不利的。黄色只是暂时存在,以帮助我想象空间分布。 this

最佳答案

有更好的选择允许用户在 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?

关于java - 如何使用 Mask 从 JFormattedTextField 获取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22670461/

相关文章:

java - 如何将 JEditorPane 插入 JTable 单元格?

java - 使用单个对象在单击按钮时将 JLabel 动态添加到 Java 中的 UI

java - JTable 中未选中的复选框会给出 NullPointerException

java - 这是有效的日期格式吗 - 2007-12-13+01 :00?

java - 为什么 TimerTask 运行了两次?

java - 使用 java 11 编译后的堆外泄漏

java - 通过终止程序关闭流 - 常见做法?

java - 当与 Spring Data JPA 结合使用时,事务注释并没有使我的代码变得原子。请建议

java - 带有特殊字符的 String 的 contains 和 replaceAll 方法的奇怪行为

mysql - 在用 mysql 填充的表上格式化日期和时间