2010-10-06 19 views
6

मेरे पास स्पिनरडेट मॉडल का उपयोग कर एक जेएसपीनर है, जिसकी शुरुआत 1 जनवरी, 2010 00: 00: 00.000 की शुरुआत है, अंतिम तिथि 1 जनवरी 2010 00:12 है : 34.217। मैं अपने JSpinner.DateEditor को प्रारूप एचएच: मिमी: एसएसएसएसएस का उपयोग करना चाहता हूं लेकिन स्पिनर इस प्रारूप के साथ स्पिन नहीं करता है। यह केवल तब स्पिन करता है जब प्रारूप में "yyyy" जोड़ा जाता है। मैं इसके पास कैसे आ सकता हूं?JSpinner.DateEditor को वर्ष शामिल होना चाहिए, भले ही शुरुआत और अंत एक ही वर्ष हो,

import java.awt.GridLayout; 
import java.util.*; 
import javax.swing.*; 

public class T extends JPanel { 

    public T() { 
     super(new GridLayout(2, 2)); 
     init(); 
    } 

    private void init() { 
     Calendar start = GregorianCalendar.getInstance(); 
     Calendar end = GregorianCalendar.getInstance(); 
     start.clear(); 
     end.clear(); 
     start.set(Calendar.YEAR, 2010); 
     end.set(Calendar.YEAR, 2010); 
     end.add(Calendar.HOUR_OF_DAY, 12); 
     SpinnerDateModel m1 = 
       new SpinnerDateModel(start.getTime(), start.getTime(), 
       end.getTime(), Calendar.MILLISECOND); 
     SpinnerDateModel m2 = 
       new SpinnerDateModel(start.getTime(), start.getTime(), 
       end.getTime(), Calendar.MILLISECOND); 
     JSpinner workingSpinner = new JSpinner(m1); 
     workingSpinner.setEditor(
       new JSpinner.DateEditor(workingSpinner, 
       "yyyy HH:mm:ss.SSS")); 
     JSpinner notWorkingSpinner = new JSpinner(m2); 
     notWorkingSpinner.setEditor(
       new JSpinner.DateEditor(notWorkingSpinner, 
       "HH:mm:ss.SSS")); 
     add(new JLabel("Working")); 
     add(workingSpinner); 
     add(new JLabel("!Working")); 
     add(notWorkingSpinner); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new T()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

उत्तर

5

जेआरई स्रोत में खुदाई करने के बाद थोड़ा सा पता चला कि स्पिनर को एक वास्तविक तिथि के बजाय टेक्स्ट वैल्यू द्वारा समर्थित किया गया है। जब आप ऊपर और नीचे स्पिन बटन दबाते हैं, तो मान पार्स किया जाता है और फिर आपके न्यूनतम और अधिकतम मानों की तुलना में किया जाता है। चूंकि आपके प्रारूप में एक वर्ष नहीं है, इसलिए वर्ष हमेशा 1 9 70 के साथ पार्स किए जाते हैं जो युग से 0 ऑफसेट होता है। जब आप इसे स्पिन करने का प्रयास करते हैं तो स्पिनर हमेशा रेंज त्रुटि से बाहर निकलने का कारण बनता है।

तेज समाधान बस 2010 के बजाय अपने साल 1970 उपयोग करने के लिए हालांकि, अगर आपकी प्रारंभिक तिथि 1970 के अंत में है स्पिनर अपने उपयोगकर्ताओं को 1971 की जनवरी (बजाय इसे में शामिल कर दी नहीं दूँगी है 1 9 70 की शुरुआत में कूद सकते हैं)।

अन्य समाधान कैलेंडर वर्ष सीमाओं को पार करने वाली तिथियों को समायोजित कर सकता है। हालांकि, यह उतना आसान नहीं है (या सुंदर)। जेआरई में जब डेटफॉर्मेटर दिनांक स्ट्रिंग को पार करता है, तो यह एकल स्ट्रिंग पैरामीटर कन्स्ट्रक्टर का उपयोग करके गतिशील रूप से कक्षा को तुरंत चालू करता है। यह स्ट्रिंग स्पिनर की तारीख है। डिफ़ॉल्ट रूप से, यह कक्षा या तो तिथि या इसके कुछ सबक्लास है। हम फॉर्मेटर को अपनी खुद की डेट क्लास को तत्काल बना सकते हैं जो कि किसी दिनांक की तुलना करने से पहले वर्ष को ठीक करता है।


दिनांक वर्ग कि कहते हैं साल:

public static class DateThatAddsYear extends Date { 
public DateThatAddsYear(String time) { 
    super(time); 
    Calendar cal = GregorianCalendar.getInstance(); 
    cal.setTime(this); 
    // Jump back to 2010, this needs to be implemented more thoroughly in order 
    // to support dates crossing calendar year boundaries 
    cal.set(Calendar.YEAR, 2010); 
    setTime(cal.getTimeInMillis()); 
} 
} 

मैन्युअल स्पिनर की स्थापना की, हमारे तारीख फिक्स का उपयोग कर:

JSpinner notWorkingSpinner = new JSpinner(m2); 
JSpinner.DateEditor dateEditor = new JSpinner.DateEditor(notWorkingSpinner); 
DateFormatter formatter = new DateFormatter(format); 
notWorkingSpinner.setEditor(dateEditor); 
dateEditor.getTextField().setFormatterFactory(new DefaultFormatterFactory(formatter)); 
formatter.setValueClass(DateThatAddsYear.class); // Tell it to use a different value class! 

बदसूरत, लेकिन यह काम करता है।

इसके अलावा, यदि आप जेआरई स्रोत में चारों ओर पोक करना चाहते हैं तो मैं इंटरनेशनलफॉर्मेटर (डेटफॉर्मेटर के सुपरक्लास) की सार्वजनिक विधि stringToValue(String text) को देखने का सुझाव देता हूं।

+0

सही, यह 12: 00: 00.000 पर रुकने में विफल रहता है। मॉडल में अंत स्थापित नहीं करना पसंद है। – initialZero

+0

इसके अलावा, किसी कारण से आपका उदाहरण पीछे की ओर नहीं घूमता है। – initialZero

+0

अपडेट किया गया - समस्या मूल रूप से सोचा था की तुलना में बहुत गहरा था। – Andy

0

मुझे यकीन है कि नहीं कर रहा हूँ क्यों कि काम कर रहा है, लेकिन नहीं है आप के लिए एम 2 की घोषणा बदलते हैं:

SpinnerDateModel एम 2 = नए SpinnerDateModel(); m2.setValue (start.getTime());

यह काम करता है।

+0

ऐसा इसलिए है क्योंकि एम 2 के पास अंत समय नहीं होगा। – initialZero

+0

यह टिप्पणी गलत थी इसलिए मैंने इसे हटा दिया। –

0

यह बदसूरत है लेकिन मुझे यह काम मिल गया।

यहां कोड है। मैं बस जेएसपीनर के लिए addChangeListener के अंदर रेंज सत्यापन का ख्याल रखता हूं।

import java.awt.GridLayout; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class T extends JPanel { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public T() { 
     super(new GridLayout(2, 2)); 
     init(); 
    } 

    public Calendar end; 
    public JSpinner notWorkingSpinner; 
    private void init() { 
     Calendar start = GregorianCalendar.getInstance(); 
     end = GregorianCalendar.getInstance(); 
     start.clear(); 
     end.clear(); 

     start.set(Calendar.YEAR, 2010); 
     end.set(Calendar.YEAR, 2010); 

     end.add(Calendar.HOUR_OF_DAY, 12); 
     SpinnerDateModel m1 = 
       new SpinnerDateModel(start.getTime(), start.getTime(), 
       end.getTime(), Calendar.MILLISECOND); 

     SpinnerDateModel m2 = new SpinnerDateModel(); 
     m2.setValue(start.getTime()); 

     JSpinner workingSpinner = new JSpinner(m1); 
     workingSpinner.setEditor(
       new JSpinner.DateEditor(workingSpinner, 
       "yyyy HH:mm:ss.SSS")); 
     notWorkingSpinner = new JSpinner(m2); 
     notWorkingSpinner.setEditor(
       new JSpinner.DateEditor(notWorkingSpinner, 
       "HH:mm:ss.SSS")); 

     notWorkingSpinner.addChangeListener(new ChangeListener() { 

      @Override 
     public void stateChanged(ChangeEvent e) { 
      SpinnerModel dateModel = notWorkingSpinner.getModel(); 
      if(dateModel instanceof SpinnerDateModel){ 
       Date check = ((SpinnerDateModel)dateModel).getDate(); 

       Calendar checkCal = GregorianCalendar.getInstance(); 
       checkCal.setTime(check); 
       checkCal.set(Calendar.YEAR, end.get(Calendar.YEAR)); 
       checkCal.set(Calendar.MONTH, end.get(Calendar.MONTH)); 
       checkCal.set(Calendar.DAY_OF_MONTH, end.get(Calendar.DAY_OF_MONTH)); 

       if(checkCal.get(Calendar.HOUR_OF_DAY) == 23){ 
        dateModel.setValue(start.getTime()); 
       } else if(checkCal.getTime().compareTo(end.getTime()) > 0){ 
        dateModel.setValue(end.getTime());    
       } 
      } 
     } 
     }); 

     add(new JLabel("Working")); 
     add(workingSpinner); 
     add(new JLabel("!Working")); 
     add(notWorkingSpinner); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new T()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

जब आप पीछे की ओर घूमते हैं तो यह रुकता नहीं है। मुझे कल्पना है कि यह शुरू करने के लिए सिर्फ एक और जांच है। – initialZero

+0

हां, मैं सहमत हूं। मैं बस शीर्ष उच्च स्तर की जांच के बारे में सोच रहा था। हमें बस "शुरुआत" के लिए भी एक चेक जोड़ने की जरूरत है। –

+0

मैंने निम्न अंत सीमा को समायोजित करने के लिए उत्तर तय किया। –

संबंधित मुद्दे