나는 이것이 이상하다고 맹세한다. 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
그래, 평소 형식으로 변경하면 작동합니다. 그러나 여전히 문자열의 가장 왼쪽 부분 만 변경합니다 (다른 부분을 강조 표시 할 때 제외). 그러면 "calendarField time unit"(마지막 매개 변수)의 목적은 무엇입니까? 그리고 나는 그 시간을 보여주고 싶다. 개발자가 문자열을 기반으로 값을 읽도록 코딩하는 이유는 무엇인지 이해할 수 없습니까? 그건 말도 안돼! 그들은 생성자에서 설정 한 날짜에 액세스 할 수 있습니다. – William
나는 모델이 제대로 작동하고 있다고 생각한다. 편집자는 HH : mm을 날짜로 변환 할 때 현재 날짜를 사용하지 않는다. 회 전자가 반환 한 날짜의 시간과 분 값만 사용하도록 다운 스트림 코드를 수정해야 할 수도 있습니다. 또는 다운 스트림 코드 전체 날짜가 필요한 경우 새 날짜를 만들고 시간/분을 설정할 수 있습니다. –
내 생각에 텍스트 필드의 문자열에 따라 원래 날짜 인스턴스에 액세스 할 수있는 구성 요소를 디자인하는 이유는 무엇입니까? 그렇다면 최소한 스피너의 버튼으로 변경할 수있는 날짜 부분을 지정하도록 설정할 수있는 매개 변수가 필요합니다. – William