2012-12-06 23 views
2

我發誓這很奇怪。我做了一個微調,使用新的SpinnerDateModel設置模型,包含當前日期,無限制和Calendar.MINUTE單位。JSpinner與SpinnerDateModel奇怪的行爲

因爲它在文檔中據說:

創建表示 開始和結束之間的日期序列的SpinnerDateModel。 nextValue和previousValue方法通過將calendar的當前日期 的值按calendarField時間單位進行計算,從而計算出序列的 元素。開始和結束參數可以爲空,以指示範圍沒有上限或下限。

這裏是我的代碼:

import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import javax.swing.JFrame; 
import javax.swing.JSpinner; 
import javax.swing.JSpinner.DefaultEditor; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import javax.swing.text.DateFormatter; 
import javax.swing.text.DefaultFormatterFactory; 

public class JSpinnerTest { 

    public JSpinnerTest() { 
     initComponents(); 
    } 

    private void initComponents() { 
     JFrame frame = new JFrame("JSpinner Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JSpinner spinner = new JSpinner(); 
     spinner.setModel(new javax.swing.SpinnerDateModel(new Date(), null, null, Calendar.MINUTE)); 
     SimpleDateFormat format = new SimpleDateFormat("HH:mm"); 

     ((DefaultEditor) spinner.getEditor()).getTextField().setFormatterFactory(new DefaultFormatterFactory(new DateFormatter(format))); 


     System.out.println("ORIGINAL VALUE: " + spinner.getValue().toString()); 

     spinner.addChangeListener(new ChangeListener() { 
      @Override 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("VALUE: " + ((JSpinner) e.getSource()).getValue().toString()); 
      } 
     }); 

     frame.add(spinner); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JSpinnerTest(); 
      } 
     }); 
    } 
} 

但我在小小的箭頭按鈕點擊日期重置爲Jan 01 1970爲什麼每一次?

示例輸出:

原值:星期四12月6 17點06分13秒ICT 2012

VALUE:星期四1月1 17點06分00秒ICT 1970

VALUE:星期四17年1月1日:06:00 1970年ICT

VALUE:星期四1月1 18時06分00秒ICT 1970年

回答

0

如果你把日期格式,包括這不會發生的日期,「DD/MM/YY HH:毫米」。我知道這不是你要求的,但我會假設,當你不明確說明日期時,它默認不使用它們。

1

您正在修改附加到Spinner的編輯器使用的日期格式。它看起來像是當你使用HH:mm格式時,其餘的字段是用紀元初始化的。如果您不更改日期編輯器使用的格式,則按預期工作。

+0

是的,它會工作時,你的格式更改爲通常的。但它仍然只改變了字符串的最左邊部分(除了突出顯示其他部分時)。那麼「calendarField時間單位」(最後一個參數)的目的是什麼?我只想顯示時間。我不明白爲什麼開發人員將它編碼爲基於字符串讀取值?這是荒謬的!他們可以訪問從構造函數中設置的日期。 – William

+0

我認爲模型運行正常,編輯器在將HH:mm轉換爲日期時並未使用當前日期。您可能需要修改下游代碼以僅使用微調器返回的日期中的小時和分鐘值。或者,如果您的下游代碼需要完整日期,則可以創建新日期並設置小時/分鐘。 –

+0

不在我心中,爲什麼我會設計一個可以訪問原始日期實例以取決於文本字段的字符串的組件?如果是這種情況,那麼我至少需要一個參數,可以設置該參數來指定可以通過微調器按鈕更改日期的哪一部分。 – William