2014-03-26 18 views
1

我花了很多时间阅读Java文档和相关问题,但仍然无法准确理解我需要做什么来完成我想要的功能。如何从带有Mask的JFormattedTextField获取日期

我知道,我将使用一个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; 
    } 

此日期反映了 “周结束日期”,这是周日在我的情况。此日期将被发送到数据库,并将用于自动显示本周其余日期的日期。例如:

如果用户输入的星期结束日期为3/30/2014,则表单上的JLabel将在文本“Sunday”下填充为3/30,在星期六下方填充3/29 ,等到星期一。这将我带到我的下一个问题,减去日期。

我已经完成了对JodaTime的所有研究,但我也看到有人提到新的Java8 JDK解决了Java在日期方面的许多弱点。

我在寻找制图方面的指导/列出了我的要求,因为我感到非常混乱,似乎无法找到足够强的方向。我也希望对JDK8使用日期的方式提供任何反馈,并且它是比Joda更好的选择。 (我知道这里的主观性被皱起了眉头,但我不知道还有什么要问的。)

编辑可视化可能有帮助。该小组将印刷,因此JSpinner不利。黄色只在那里暂时帮助我想象空间分布。 this

+0

关于如何增加/。减去一个'日期'见:http://stackoverflow.com/questions/428918/how-can-i-increment-a-date-by-one-day-in-java – DSquare

回答

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?

+0

谢谢你的回答。我曾经看到过一些人在类似的问题中推荐JSpinner。我唯一的担心,以及为什么我一直在避免它,是因为我需要打印正在处理的JPanel;所以使用JSpinner似乎看起来不太干净。 –

+0

不客气:)是的,也许它不会,但另一方面,它会更容易输入数据。 'JFormattedTextfield'功能非常强大('JSpinner'使用该组件),但在这种情况下,您将必须非常努力地工作(解析日期,验证输入等),以实现*几乎*相同的功能,而不是说用户'输入不会像使用'JSpinner'那样简单(更不用说像JDateChooser或JXDatePicker这样的日期选择器)。在一天结束的时候,用户会比丝网印刷清洁度更好,更容易输入数据。 @solleks – dic19