我發誓這很奇怪。我做了一個微調,使用新的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年
是的,它會工作時,你的格式更改爲通常的。但它仍然只改變了字符串的最左邊部分(除了突出顯示其他部分時)。那麼「calendarField時間單位」(最後一個參數)的目的是什麼?我只想顯示時間。我不明白爲什麼開發人員將它編碼爲基於字符串讀取值?這是荒謬的!他們可以訪問從構造函數中設置的日期。 – William
我認爲模型運行正常,編輯器在將HH:mm轉換爲日期時並未使用當前日期。您可能需要修改下游代碼以僅使用微調器返回的日期中的小時和分鐘值。或者,如果您的下游代碼需要完整日期,則可以創建新日期並設置小時/分鐘。 –
不在我心中,爲什麼我會設計一個可以訪問原始日期實例以取決於文本字段的字符串的組件?如果是這種情況,那麼我至少需要一個參數,可以設置該參數來指定可以通過微調器按鈕更改日期的哪一部分。 – William