2010-08-19 13 views
23

JTextField में दर्ज वर्णों की संख्या को सीमित कैसे करें?JTextField में वर्णों की संख्या को सीमित करने के लिए कैसे?

मान लीजिए कि मैं 5 वर्ण अधिकतम दर्ज करना चाहता हूं। उसके बाद इसमें कोई पात्र दर्ज नहीं किया जा सकता है।

+2

हालांकि एक कस्टम दस्तावेज़ का उपयोग कर काम करेंगे, इस समाधान करने के लिए पसंदीदा तरीका है या तो JFormattedTextField या एक DocumentFilter उपयोग करने के लिए उपयोग करने के लिए। ये दोनों विशेषताएं हैं जिन्हें संस्करण 1.3 में जेडीके में जोड़ा गया है, मुझे विश्वास है। स्विंग ट्यूटोरियल इन दोनों दृष्टिकोणों को कवर करता है (और ट्यूटोरियल से कस्टम दस्तावेज़ दृष्टिकोण को भी हटा देता है)। – camickr

+0

FYI जावा 1.4 के बाद से, अब इसकी आवश्यकता नहीं है और अनुशंसा की जाती है कि आप इस कार्यक्षमता के लिए 'दस्तावेज़' का उपयोग करें, इसके बजाय 'दस्तावेज़ फ़िल्टर' का उपयोग करें, [दस्तावेज़ फ़िल्टर कार्यान्वित करना] देखें (http://docs.oracle.com/javase अधिक जानकारी के लिए /tutorial/uiswing/components/generaltext.html#filter) और [DocumentFilter उदाहरण] (http://www.jroller.com/dpmihai/entry/documentfilter) – MadProgrammer

उत्तर

29

http://www.rgagnon.com/javadetails/java-0198.html

import javax.swing.text.PlainDocument 

public class JTextFieldLimit extends PlainDocument { 
    private int limit; 

    JTextFieldLimit(int limit) { 
    super(); 
    this.limit = limit; 
    } 

    public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException { 
    if (str == null) return; 

    if ((getLength() + str.length()) <= limit) { 
     super.insertString(offset, str, attr); 
    } 
    } 
} 

फिर

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

public class DemoJTextFieldWithLimit extends JApplet{ 
    JTextField textfield1; 
    JLabel label1; 

    public void init() { 
    getContentPane().setLayout(new FlowLayout()); 
    // 
    label1 = new JLabel("max 10 chars"); 
    textfield1 = new JTextField(15); 
    getContentPane().add(label1); 
    getContentPane().add(textfield1); 
    textfield1.setDocument 
     (new JTextFieldLimit(10)); 
    } 
} 

(पहले गूगल से परिणाम)

+3

उत्तर की व्याख्या करने के लिए कुछ और टिप्पणियां आपका स्वागत होंगी। – jfpoilpret

+1

क्या कोई प्रत्यक्ष कार्य नहीं है जैसे textfield.maximumlimit (10); –

+0

नहीं, और यह आपको उस वर्ग का उपयोग करने के लिए कहता है जो 'जेटीएक्स्टफिल्ल्ड' के लिए जावाडोक में 'प्लेनडॉक्यूमेंट' को बढ़ाता है http://download.oracle.com/javase/6/docs/api/javax/swing/JTextField.html –

7

आप चाहते हैं एक ही कोड का टुकड़ा में सब कुछ है, तो आप के साथ टिम जवाब मिश्रण कर सकते हैं JTextField के लिए एपीआई पर उदाहरण का दृष्टिकोण मिला, और आपको कुछ ऐसा मिलेगा:

public class JTextFieldLimit extends JTextField { 
    private int limit; 

    public JTextFieldLimit(int limit) { 
     super(); 
     this.limit = limit; 
    } 

    @Override 
    protected Document createDefaultModel() { 
     return new LimitDocument(); 
    } 

    private class LimitDocument extends PlainDocument { 

     @Override 
     public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException { 
      if (str == null) return; 

      if ((getLength() + str.length()) <= limit) { 
       super.insertString(offset, str, attr); 
      } 
     }  

    } 

} 

तब JTextFieldLimit में दस्तावेज़ जोड़ने की आवश्यकता नहीं है क्योंकि JTextFieldLimit में पहले से ही कार्यक्षमता है।

+0

FYI जावा 1.4 के बाद से, अब इसकी आवश्यकता नहीं है और अनुशंसा की जाती है कि आप इस कार्यक्षमता के लिए 'दस्तावेज़' का उपयोग करें, इसके बजाय 'दस्तावेज़ फ़िल्टर' का उपयोग करें, देखें [दस्तावेज़ फ़िल्टर लागू करना] (http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter) और [दस्तावेज़फिल्टर उदाहरण] (http://www.jroller.com/dpmihai/entry/documentfilter) अधिक जानकारी के लिए – MadProgrammer

4

अधिक मौजूदा समाधान के लिए Implementing a DocumentFilter पर स्विंग ट्यूटोरियल से अनुभाग पढ़ें।

यह समाधान केवल एक प्लेन दस्तावेज़ नहीं, बल्कि किसी दस्तावेज़ को काम करेगा।

यह स्वीकृत एक से अधिक वर्तमान समाधान है।

2

बस यह प्रयास करें:

textfield.addKeyListener(new java.awt.event.KeyAdapter() { 
    public void keyTyped(java.awt.event.KeyEvent evt) { 
     if(textfield.getText().length()>=5&&!(evt.getKeyChar()==KeyEvent.VK_DELETE||evt.getKeyChar()==KeyEvent.VK_BACK_SPACE)) { 
      getToolkit().beep(); 
      evt.consume(); 
     } 
    } 
}); 
+2

FYI जावा 1.4 के बाद से, अब इसकी आवश्यकता नहीं है और अनुशंसा की जाती है कि आप इस कार्यक्षमता के लिए 'दस्तावेज़' का उपयोग करें, इसके बजाय 'दस्तावेज़ फ़िल्टर' का उपयोग करें, देखें [कार्यान्वयन एक दस्तावेज़ फ़िल्टर] (http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter) और [दस्तावेज़फिल्टर उदाहरण] (http://www.jroller.com/dpmihai/entry/documentfilter) अधिक जानकारी के लिए, 'KeyListener' टेक्स्ट घटकों के साथ कभी भी अच्छा विचार नहीं है – MadProgrammer

1
import java.awt.KeyboardFocusManager; 
import javax.swing.InputVerifier; 
import javax.swing.JTextField; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 
import javax.swing.text.DocumentFilter.FilterBypass; 

/** 
* 
* @author Igor 
*/ 
public class CustomLengthTextField extends JTextField { 

    protected boolean upper = false; 
    protected int maxlength = 0; 

    public CustomLengthTextField() { 
     this(-1); 
    } 

    public CustomLengthTextField(int length, boolean upper) { 
     this(length, upper, null); 
    } 

    public CustomLengthTextField(int length, InputVerifier inpVer) { 
     this(length, false, inpVer); 
    } 

    /** 
    * 
    * @param length - maksimalan length 
    * @param upper - turn it to upercase 
    * @param inpVer - InputVerifier 
    */ 
    public CustomLengthTextField(int length, boolean upper, InputVerifier inpVer) { 
     super(); 
     this.maxlength = length; 
     this.upper = upper; 
     if (length > 0) { 
      AbstractDocument doc = (AbstractDocument) getDocument(); 
      doc.setDocumentFilter(new DocumentSizeFilter()); 
     } 
     setInputVerifier(inpVer); 
    } 

    public CustomLengthTextField(int length) { 
     this(length, false); 
    } 

    public void setMaxLength(int length) { 
     this.maxlength = length; 
    } 

    class DocumentSizeFilter extends DocumentFilter { 

     public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) 
       throws BadLocationException { 

      //This rejects the entire insertion if it would make 
      //the contents too long. Another option would be 
      //to truncate the inserted string so the contents 
      //would be exactly maxCharacters in length. 
      if ((fb.getDocument().getLength() + str.length()) <= maxlength) { 
       super.insertString(fb, offs, str, a); 
      } 
     } 

     public void replace(FilterBypass fb, int offs, 
       int length, 
       String str, AttributeSet a) 
       throws BadLocationException { 

      if (upper) { 
       str = str.toUpperCase(); 
      } 

      //This rejects the entire replacement if it would make 
      //the contents too long. Another option would be 
      //to truncate the replacement string so the contents 
      //would be exactly maxCharacters in length. 
      int charLength = fb.getDocument().getLength() + str.length() - length; 

      if (charLength <= maxlength) { 
       super.replace(fb, offs, length, str, a); 
       if (charLength == maxlength) { 
        focusNextComponent(); 
       } 
      } else { 
       focusNextComponent(); 
      } 
     } 

     private void focusNextComponent() { 
      if (CustomLengthTextField.this == KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()) { 
       KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent(); 
      } 
     } 
    } 
} 
6

महान सवाल है, और यह अजीब है कि स्विंग टूलकिट JTextFields के लिए मूल रूप से इस कार्यक्षमता शामिल नहीं है। लेकिन, यहां मेरी Udemy.com पाठ्यक्रम से एक महान जवाब "जावा जानें बच्चे की तरह" है:

txtGuess = new JTextField(); 
txtGuess.addKeyListener(new KeyAdapter() { 
    public void keyTyped(KeyEvent e) { 
     if (txtGuess.getText().length() >= 3) // limit textfield to 3 characters 
      e.consume(); 
    } 
}); 

यह एक अनुमान लगाने का खेल पाठ क्षेत्र में पात्रों की संख्या को सीमित 3 अक्षरों, keyTyped घटना अधिभावी और जाँच करके यह देखने के लिए कि क्या टेक्स्टफील्ड में पहले से 3 वर्ण हैं - यदि हां, तो आप मुख्य ईवेंट (ई) "उपभोग" कर रहे हैं ताकि यह सामान्य की तरह संसाधित न हो।

2

मैं निम्नलिखित कोड सेगमेंट का उपयोग करके इस समस्या का समाधान कर दिया है:

private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) { 
    boolean max = jTextField1.getText().length() > 4; 
    if (max){ 
     evt.consume(); 
    }   
} 
+0

काम नहीं करता है अगर उपयोगकर्ता कॉपी-पेस्ट के साथ "धोखा" – Ewoks

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

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