2014-03-26 31 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