2013-01-22 63 views
1

我在我的項目中使用了幾個JSpinners來顯示小時和分鐘。當JSpinner增加或減少時,我必須將值保存到數據庫。但問題是JSpinners給我舊的價值觀。 eg-如果顯示的時間是09:30,我將時間增加到10:30,我得到09:30作爲返回值。我使用下面的代碼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); 
    } 
} 

如果我使用tf.getText()我越來越老值的兩倍,但如果我使用spinner.getValue我得到了新的價值,但它是在長格式

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

Java swing使用MVC模式,所以它在JSpinner中是一樣的。如果您查看JSpinner源代碼,您會發現getValue()方法實際上是調用getModel()。getValue(),因此它調用模型的getValue。並且您使用的模型是SpinnerDateModel,並且它的值將是Date對象,當您打印Date對象時,它將顯示默認格式,如「Thu Jan 01 11:18:00 IST 1970」,如果您想要獲取像「11:18」,則需要對其進行格式化yourself.like

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

你可能想知道爲什麼tf.getText()只能得到舊值,因爲在離心機上的發生的ChangeEvent後,一個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

我認爲他想要的答案是「格式微調只給11:18」,你的解決方案給他和以前一樣的結果,比如「Tue Jan 22 04:17:54 CST 2013」​​。 – snow8261

+0

@ snow8261你可能是對的,這個回答是迴應OP的要求。我可能一直對「原創」這個詞感到困惑。我添加了一個簡單的'getTime'方法,它使用'SimpleDateFormat'將字段'Date'的值格式化爲時間'String' – MadProgrammer