2012-12-06 9 views
2

나는 이것이 이상하다고 맹세한다. Spinner를 만들고, 현재 날짜, 제한 없음, Calendar.MINUTE 단위를 가진 새로운 SpinnerDateModel로 모델을 설정합니다.JSpinner with SpinnerDateModel 이상한 행동

이 문서에서 말했다 것 같이

이 시작과 끝 사이의 일자의 순서를 나타내는 SpinnerDateModel를 작성합니다. nextValue 및 previousValue 메서드는 값을 calendarField 시간 단위로 앞당기거나 역으로 변경하여 시퀀스의 요소를 계산합니다. start 및 end 매개 변수는 범위에 상한 또는 하한이 없음을 나타 내기 위해 null 일 수 있습니다.

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(); 
      } 
     }); 
    } 
} 

하지만 1월 1일 1970 이유에 작은 화살표 버튼 날짜 재설정을 클릭 할 때마다 :

그리고 여기 내 코드?

예제 출력 :

ORIGINAL VALUE : 목 십이 06 17시 6분 13초 ICT 2,012

VALUE : 목 일월 01 17시 6분 0초 ICT 1,970

VALUE : 목 일월 01 17 : 06 : 00 ICT 1970

VALUE : 목 1월 1일 18시 6분 0초 ICT 1970

답변

0

이 발생하지 않는 날짜를 포함하도록 DATEFORMAT에 넣어 경우, "일/월/HH 전년 동기 : mm "입니다. 나는 이것이 당신의 요구 사항이 아니라는 것을 알고 있습니다. 그러나 당신이 명시 적으로 날짜를 명시하지 않을 경우 기본값을 사용하지 않을 것이라고 가정 할 것입니다.

1

Spinner에 첨부 된 편집기에서 사용하는 날짜 형식을 수정하고 있습니다. HH : mm 형식을 사용하는 경우 나머지 필드는 기원으로 초기화됩니다. 날짜 편집기에서 사용하는 형식을 변경하지 않으면 예상대로 작동합니다.

+0

그래, 평소 형식으로 변경하면 작동합니다. 그러나 여전히 문자열의 가장 왼쪽 부분 만 변경합니다 (다른 부분을 강조 표시 할 때 제외). 그러면 "calendarField time unit"(마지막 매개 변수)의 목적은 무엇입니까? 그리고 나는 그 시간을 보여주고 싶다. 개발자가 문자열을 기반으로 값을 읽도록 코딩하는 이유는 무엇인지 이해할 수 없습니까? 그건 말도 안돼! 그들은 생성자에서 설정 한 날짜에 액세스 할 수 있습니다. – William

+0

나는 모델이 제대로 작동하고 있다고 생각한다. 편집자는 HH : mm을 날짜로 변환 할 때 현재 날짜를 사용하지 않는다. 회 전자가 반환 한 날짜의 시간과 분 값만 사용하도록 다운 스트림 코드를 수정해야 할 수도 있습니다. 또는 다운 스트림 코드 전체 날짜가 필요한 경우 새 날짜를 만들고 시간/분을 설정할 수 있습니다. –

+0

내 생각에 텍스트 필드의 문자열에 따라 원래 날짜 인스턴스에 액세스 할 수있는 구성 요소를 디자인하는 이유는 무엇입니까? 그렇다면 최소한 스피너의 버튼으로 변경할 수있는 날짜 부분을 지정하도록 설정할 수있는 매개 변수가 필요합니다. – William