2012-06-15 8 views
6

में 24 घंटों का समय सख्त मैं एक जेएफओर्मेटेड टेक्स्टफिल्ड बनाने की कोशिश कर रहा हूं जो केवल 24 घंटे का समय स्वीकार करता है।JFormattedTextField

मैं एक समाधान के बहुत करीब हूं, लेकिन एक ऐसा मामला है जहां निम्न कोड उदाहरण काम नहीं करता है।

यदि आप समय "222" दर्ज करते हैं और फ़ील्ड से फ़ोकस बदलते हैं, तो समय "2202" में सही होता है। मैं इसे केवल 4 घंटे के पूर्ण 4 अंकों को स्वीकार करना चाहता हूं। यह कोड काम करता है जैसा कि मैं लगभग सभी मामलों में चाहता हूं, सिवाय इसके कि मैंने अभी उल्लेख किया है। कोई सुझाव?

public static void main(String[] args) throws ParseException { 
     DateFormat dateFormat = new SimpleDateFormat("HHmm"); 
     dateFormat.setLenient(false); 

     DateFormatter dateFormatter = new DateFormatter(dateFormat); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JFormattedTextField textField = new JFormattedTextField(dateFormatter); 
     frame.add(textField, BorderLayout.NORTH); 

     frame.add(new JTextField("This is here so you can change focus."), BorderLayout.SOUTH); 
     frame.setSize(250, 100); 
     frame.setVisible(true); 
    } 
+0

आसान तरीके को 'JTextField' का प्रयोग होता है, और' का उपयोग कर DocumentFilter' :-) [DocumentFilter] (के लिए: http:/मेरी प्राथमिकता दी दृष्टिकोण SimpleDateFormat उपवर्गीकरण एक ही स्थान पर सभी पार्स तर्क रखने के लिए किया जाएगा /docs.oracle.com/javase/7/docs/api/javax/swing/text/DocumentFilter.html) आप इसे देख सकते हैं [उदाहरण] (http://stackoverflow.com/questions/9477354/how-to-allow -इंटरोडिंग-केवल-अंक-इन-जेटेक्स्टफील्ड/9478124 # 9478124) –

+0

सत्य नहीं है, 02:22 या 22:02 – mKorbel

+4

हो सकता है यदि आप SimpleDateFormat का उपयोग कर रहे हैं तो आप भाग्य से बाहर हो सकते हैं। जावाडोक से: "पार्सिंग के लिए, पैटर्न अक्षरों की संख्या को अनदेखा किया जाता है जब तक कि दो आसन्न क्षेत्रों को अलग करने की आवश्यकता न हो।" यह पहले दो अंकों को घंटे के क्षेत्र के रूप में पार करता है, इसलिए यह जानता है कि शेष अंक मिनट फ़ील्ड होना चाहिए। – Alex

उत्तर

5

दूसरों का उल्लेख किया है के रूप में, अपने सबसे अच्छे शर्त करने के लिए शायद है इनपुट स्ट्रिंग के लंबाई को मान्य करें।

public class LengthCheckingDateFormat extends SimpleDateFormat { 

    public LengthCheckingDateFormat(String pattern) { super(pattern); } 

    @Override 
    public Date parse(String s, ParsePosition p) { 
    if (s == null || (s.length() - p.getIndex()) < toPattern().length()) { 
     p.setErrorIndex(p.getIndex()); 
     return null; 
    } 
    return super.parse(s, p); 
    } 
} 
+0

या इससे भी अधिक पुन: प्रयोज्य: मानक जावा प्रारूप के लिए एक सजावटी बनाएं जो केवल इंगित करता है कि पार्सिंग सफल है जब संपूर्ण इनपुट स्ट्रिंग को पार्स किया जा सकता है (एक 'ParseAllFormat'), इसलिए इसे पुन: उपयोग किया जा सकता है – Robin

+1

ग्रेट उत्तर, मुझे SimpleDateFormat को ओवरराइड करना पसंद है फोकस श्रोता जोड़ना। आपके कोड में किए गए एक बदलाव को ParseException फेंकने की बजाय है, मैं SimpleDateFormat पार्स विधि JavaDoc के अनुसार शून्य वापस लौटाता हूं। – FuryComputers

+0

@ रोबिन अच्छा बिंदु, यह संभवतः एक ही जांच करने के लिए एक सामान्य फॉर्मेटर को लपेटने के लिए बदला जा सकता है। – Alex

2

मुझे आश्चर्य है कि DateFormatter 'लगभग' सभी चाल चल रहा है।

इसलिए, आप अपनी विधि को ओवरराइड क्यों नहीं करते हैं जो अंतिम प्रवेश और प्रारूपण को सभी String एस के इलाज के लिए करता है जो String खाली के रूप में बहुत कम हैं।

 DateFormatter dateFormatter = new DateFormatter(dateFormat) { 
      @Override 
      public Object stringToValue(String text) throws ParseException { 
       if(!getFormattedTextField().hasFocus()) 
        if (text.length() != 4) { 
         return null; 
        } 
       return super.stringToValue(text); 
      }    
     }; 

संपादित करें:

@nIcE गाय ने सुझाव दिया सबसे आसान फोकस खो दिया पर यह सेवा करने के लिए किया जाएगा:

final JFormattedTextField textField = new JFormattedTextField(dateFormatter); 
    textField.addFocusListener(new FocusAdapter() { 
     @Override 
     public void focusLost(FocusEvent e) { 
      super.focusLost(e); 
      if(textField.getText().length() != 4) 
       textField.setText(""); 
     } 
    }); 
+0

मैं कहूंगा कि यह दृष्टिकोण समय की परीक्षा खड़ा हो सकता है :-) –

+0

@nIcEcOw मैं कहूंगा कि यह 'JFormattedTextField' के अप्रत्याशित व्यवहार की ओर जाता है। आम तौर पर जब मान अमान्य है तो यह 'focusLost' पर पिछले मान्य मान पर वापस आता है। लेकिन यहां आप सामग्री को मैन्युअल रूप से संशोधित कर रहे हैं ...। और सुनिश्चित नहीं है कि जब आप अमान्य मान के साथ ENTER दबाते हैं तो क्या होगा। तो मैं दृढ़ता से सुझाव देता हूं कि एलेक्स – Robin

+0

@Robin ENTER द्वारा पोस्ट किए गए स्वीकृत उत्तर के लिए डिफ़ॉल्ट रूप से कुछ भी नहीं करता है। बीटीडब्लू: मुझे 'डेटफॉर्मेटर' की विधि मिली जो प्रारूप में मैंने अपने उत्तर में शामिल एक समाधान जोड़ा, दुख की बात यह है कि यह टेक्स्ट फ़ील्ड के फोकस पर भी रिले करता है क्योंकि मुझे यकीन नहीं था कि कॉल करने के लिए सही समय का पता कैसे लगाया जाए किसी भी कुंजी प्रविष्टि पर विधि 'stringToValue' के रूप में लंबाई परीक्षण कहा जाता है। इसे सब एक साथ रखकर मैं एलेक्स के जवाब के साथ जाऊंगा (+1) क्योंकि यह कम हैकी है। – Boro

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