2013-01-22 1 views
1

시간과 분을 표시하는 프로젝트에서 몇 명의 JSpinners를 사용하고 있습니다. JSpinner가 증가하거나 감소 할 때 데이터베이스에 값을 저장해야합니다. 그러나 문제는 JSpinners가 나에게 오래된 가치를 부여한다는 것입니다. 예 - 표시되는 시간이 09:30이고 시간이 10:30으로 증가하면 반환 값으로 09:30이 표시됩니다. 내가 두 번 이전 값을 얻고있다하지만 난 내가 새 값을 얻고있다 spinner.getValue를 사용하고있는 경우 그러나 긴 형식으로되어 tf.getText()를 사용하고 있다면 다음 코드JSpinner에서 이전 값을 제공합니다.

업데이트] SSCCE

package spinnerupdation; 

import java.awt.Container; 
import java.awt.FlowLayout; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import javax.swing.JFormattedTextField; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerDateModel; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import javax.swing.text.DateFormatter; 
import javax.swing.text.DefaultFormatterFactory; 

/** 
* 
* @author Rohan Kandwal 
*/ 
public class SpinnerUpdation extends JFrame{ 
public JSpinner spinner; 
    SpinnerUpdation(){ 
     Container pane=this.getContentPane(); 
     JPanel panel=new JPanel(); 
     panel.setLayout(new FlowLayout()); 
     SpinnerDateModel model=new SpinnerDateModel(); 
     model.setCalendarField(Calendar.HOUR); 
     spinner=new JSpinner(); 
     spinner.setModel(model); 
     spinner.setEditor(new JSpinner.DateEditor(spinner,"hh:mm")); 
     panel.add(spinner); 
     pane.add(panel); 
     spinner.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
         JFormattedTextField tf = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField(); 
         DefaultFormatterFactory factory = (DefaultFormatterFactory) tf.getFormatterFactory(); 
         DateFormatter formatter = (DateFormatter) factory.getDefaultFormatter(); 

         // Change the date format to only show the hours 
         formatter.setFormat(new SimpleDateFormat("hh:mm")); 
         //formatter.setCommitsOnValidEdit(true); 

       System.out.println(spinner.getValue()); 
       //System.out.println(tf.getText()); 
      } 
     }); 


      } 
    public static void main(String[] args) { 
     SpinnerUpdation ss=new SpinnerUpdation(); 

     ss.setDefaultCloseOperation(ss.EXIT_ON_CLOSE); 
     ss.setSize(574, 445); 
    //ss.pack(); 

    ss.setLocationRelativeTo(null); 
    ss.setResizable(false); 
    ss.setVisible(true); 
    } 
} 

을 사용하고

Thu Jan 01 10:18:00 IST 1970 
Thu Jan 01 11:18:00 IST 1970 

회 전자 형식은 11:18으로 지정해야합니까?

+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+0

[this] (http://stackoverflow.com/questions/3949382/jspinner-value-change-events) 도움이 될지 모르지만 이것이 귀하가 찾고있는 것일 수 있습니다. – supersam654

+0

@AndrewThompson 코드가 너무 커서 다른 부분이 내 문제와 관련하여 불필요합니다 –

답변

2

자바 스윙은 MVC 패턴을 사용하므로 JSpinner에서와 동일합니다. JSpinner 소스 코드를 살펴보면 getValue() 메서드는 실제로 getModel(). getValue()를 호출하므로 모델의 getValue를 호출하고 있음을 알 수 있습니다. 그리고 당신이 사용하는 모델은 SpinnerDateModel이고, 그 값은 Date 객체가 될 것입니다. Date 객체를 인쇄 할 때, "Thu Jan 01 11:18:00 IST 1970"과 같은 기본 포맷을 표시합니다. "11시 18분"같은, 당신은, 회 전자의 ChangeEvent를가 발생한 후 때문에 tf.getText는()는, 기존의 가치를 왜 궁금 수는

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm"); 
System.out.println(sdf.format(spinner.getValue())); 

을 yourself.like 형식을 PropertyChangeEvent가 필요합니다 tf가 발생하면 새로운 값이 설정됩니다. 물론 tf.addPropertyChangeListener와 같은 tf를들을 수 있습니다. 하지만 위의 솔루션을 사용하는 것이 좋습니다.

+0

코드가 매력처럼 작동 해 주셔서 감사 드리며 설명도 매우 좋았습니다. –

3

stateChanged 이벤트에서 시간 값을 다시 병합하는 "마스터 날짜"를 유지 관리 할 수 ​​있습니다.

public class Main { 

    public static void main(String[] args) { 
     new Main(); 
    } 

    public Main() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      add(new DateSpinner(new Date())); 
     } 

    } 

    public class DateSpinner extends JSpinner { 

     private Date masterDate; 

     public DateSpinner(Date date) { 
      super(new SpinnerDateModel()); 
      this.masterDate = date; 
      SpinnerDateModel model = (SpinnerDateModel) getModel(); 
      model.setCalendarField(Calendar.HOUR); 
      setEditor(new JSpinner.DateEditor(this, "hh:mm")); 
      JFormattedTextField tf = ((JSpinner.DefaultEditor) getEditor()).getTextField(); 
      DefaultFormatterFactory factory = (DefaultFormatterFactory) tf.getFormatterFactory(); 
      DateFormatter formatter = (DateFormatter) factory.getDefaultFormatter(); 

      formatter.setFormat(new SimpleDateFormat("hh:mm")); 

      setValue(date); 

      addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 

        Calendar cal = Calendar.getInstance(); 
        cal.setTime(masterDate); 

        Calendar time = Calendar.getInstance(); 
        time.setTime((Date) getValue()); 

        cal.set(Calendar.HOUR_OF_DAY, time.get(Calendar.HOUR_OF_DAY)); 
        cal.set(Calendar.MINUTE, time.get(Calendar.MINUTE)); 

        masterDate = cal.getTime(); 

        System.out.println(masterDate); 

       } 

      }); 
     } 

     public String getTime() { 
      return new SimpleDateFormat("hh:mm").format((Date)getValue()); 
     } 

    } 

} 
+0

answerhe가 원하는 것은 "format spinner가 11:18 만 제공하는 것"이라면서 "Tue Jan 22 04:17:54 CST 2013"과 같은 결과를 이전과 같은 결과로 제공한다는 것입니다. – snow8261

+0

@ snow8261 당신 말이 맞을 것입니다.이 답변은 OP의 요청에 대한 응답입니다. 나는 "원본"이라는 용어를 혼동하고 있을지도 모른다. 'SimpleDateFormat'을 사용하여'Date' 필드를'String' 시간으로 포맷하는 간단한'getTime' 메소드를 추가했습니다 – MadProgrammer