Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

JTextField Difficulty

Posted on 2001-08-07
6
Medium Priority
?
933 Views
Last Modified: 2010-12-01
I need to do following things on a JTextField

1. Make sure only numbers are entered. Meaning that when a user presses a character on the keyboard nothing happens on the JTextField

2. Limit the entry to 4 digits.

3. Not allow -ve values

4. Once a valid value is entered, then on the enter key do something.

Please help me with this. Since I have tried all possible things in my capacity to figure out how to accomplish this.

Thanks In Advance

Bijoy
0
Comment
Question by:bijoyn
  • 3
  • 2
6 Comments
 
LVL 15

Expert Comment

by:mohan_sekar
ID: 6360092
Hi,

        He is the code I am using to enter only numbers

 
    Put a filtering document in you JTextField is best.
  Here is the class that I use to filter out thing basis on the  
  mask string.
 
  In you application, You only need to do:
 
 
      JTextField jtf = new JTextField(();
      //
      // Only allow numeric 0,1,2,3,4,5,6,7,8,9 to be entered
      //
      jtf.setDocument(new MyTextFilter(MyTextFilter.NUMERIC));
 
  Let me know if you need further help.  Have fun!
 
//
// file MyTextFilter.java
//
import com.sun.java.swing.text.AttributeSet;
import com.sun.java.swing.text.BadLocationException;
import com.sun.java.swing.text.PlainDocument;
 
public class MyTextFilter
  extends PlainDocument
{
  public static final String LALPHA        =
"abcdefghijklmnopqrstuvwxyz";
  public static final String UALPHA        =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  public static final String ALPHA         = LALPHA + UALPHA;
  public static final String NUMERIC       = "0123456789";
  public static final String ALPHA_NUMERIC = ALPHA + NUMERIC;
  public MyTextFilter()
  {
    this(ALPHA_NUMERIC);
  }
  public MyTextFilter(String p_charset)
  {
    m_charset = p_charset;
  }
  public void insertString(int          p_offset,
                           String       p_str,
                           AttributeSet p_attr)
    throws BadLocationException
  {
    if (p_str == null)
      return;
 
    for (int i=0; i<p_str.length(); i++)
      if (m_charset.indexOf(p_str.valueOf(p_str.charAt(i))) == -1)
        return;
     
    super.insertString(p_offset, p_str, p_attr);
  }
 
  /**
   * the allow input character set
   */
  protected String m_charset = null;
}

:-)

bye

Mohan
0
 
LVL 15

Expert Comment

by:mohan_sekar
ID: 6360130
Hi again,


       Here is the code to limit the no. of characters.
---------------------------------

import com.sun.java.swing.text.*;

public class LimitedPlainDocument extends DFPlainDocument
{
        public LimitedPlainDocument (int maxLength)
        {
                this.maxLength = maxLength;
        }

        private int maxLength;
       
        public final int getMaxLength()
                {
                        return maxLength;
                }
       
        public final void setMaxLength (int maxLength)
                {
                        this.maxLength = maxLength;
                }
       
        public void insertString (int offs, String str, AttributeSet a)
throws
BadLocationException
        {
                if (str == null || getLength() + str.length() <= maxLength)
                            super.insertString (offs, str, a);
                else
                {
                        int remainder = maxLength - getLength();
                        if (remainder > 0)
                                super.insertString (offs, str.substring (0,
remainder), a);
                }
        }
}

call jTextField.setDocument(new LimitedPlainDocument(5));

and u won't be able to enter more than 5 chars even using Clipboard operations.

:-)

bye

Mohan
0
 
LVL 15

Accepted Solution

by:
mohan_sekar earned 1200 total points
ID: 6360180
Hi again,

         Here is the code to filter -ive numbers

import java.awt.Toolkit;

import javax.swing.text.*;


/**
 * Document to only allow numbers.
 * <p>
 * @author Mike Foley
 **/
public class TextFilterDocument extends PlainDocument {

    /**
     * Valid number strings.
     **/
    public static final String NUMBERS = "0123456789";


    /**
     * TextFilterDocument, constructor
     **/
    public TextFilterDocument()
{
        super();
}


    /**
     * A String is being inserted into the Document.
     * Ensure that all characters are in NUMBERS.
     *
     * @param offset Where the new string goes.
     * @param string The String to be inserted after check.
     * @param attributeSet Attributes for the new string.
     **/
    public void insertString( int offset, String string,
                              AttributeSet attributeSet )
        throws BadLocationException {

        //
        // If nothing to insert, do nothing.
        //
        if( string == null )
            return;

        //
        // Ensure each character in the string is a number.
        //
        for( int i = 0; i < string.length(); i++ ) {
            if( NUMBERS.indexOf( string.valueOf(
                string.charAt(i) ) ) == -1 ) {
                   
                //
                // Not a number, don't insert the string.
                // Beep to let the user know something is wrong.
                //
                Toolkit.getDefaultToolkit().beep();
                return;
            }
        }

        //
        // Let our parent do the real work.
        //
        super.insertString( offset, string, attributeSet );

    }  // insertString

}  // TextFilterDocument

call the code using the following statement

JTextField integerTextField = new JTextField( new TextFilterDocument() );

I hope I have solved ur problems!!

;-)

bye

Mohan



0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 3

Expert Comment

by:rkenworthy
ID: 6360362
here's my simplified solution:

class DocumentListenerExample extends JPanel implements DocumentListener, KeyListener {

  JTextField Field = null;

  public class DocumentListenerExample() {
    Field = new JTextField();
    getContainer().add(Field);
    Field.getDocument().addDocuementListener(this);
    Field.addKeyListener(this);
  }

  public void changeUpdate(DocumentEvent evt) { }

  public void insertUpdate(DocumentEvent evt) {
    removeUpdate(evt);
  }

  public void removeUpdate(DocumentEvent evt) {
    String error = validate(Field.getText());
    if (error != null) {
      //System.out.println("Error: " + error);
      // show dialog or something...
    }
  }

  protected String validate(String text) {
    int num = -1;
    try {
      num = Integer.parseInt(text);
    }
    catch (NumberFormatException e) {
      return e.getText();
    }

    if (num < 0) return "Number cannot be negative.";

    return null;
  }

  public void keyPressed(KeyEvent e) {}
  public void keyReleased(KeyEvent e) {}

  public void keyTyped(KeyEvent e) {
    if ((int) e.getKeyChar() == KeyEvent.VK_ENTER) {
      //DO SOMETHING...
    }
  }

  public static final void main(String args[]) {
    JFrame f = new JFrame();
    f.getContainer().add(new DocumentListenerExample());
    f.pack();
    f.show()
  }
}


I didnt compile this program but should do the trick...

Hope it helps,
Rob
0
 

Author Comment

by:bijoyn
ID: 6360862
Hi Mohan & Rob

Thanks for the solutions. The difference between the two solutions are many. As I had specified. I wanted to restrict the user to input only 4 characters ( which Mohan gave me a solution ). The second was to input only numeric
values to the same textfield. this though Mohan has given me the solution. I am not sure how to combine the 1st and the second requirement together because u can setDocument to one class at a time. Also Mohan once u set the textfield to be numeric, u need not write the code for -ve numbers or do we ?.

Rob your solution allows me to enter non-numeric which is validated later. This is not what I wanted.

Mohan can u tell me how to combine the NUMERIC and the MAXLENGTH together in one Document class

Appreciate it.

Bijoy
0
 

Author Comment

by:bijoyn
ID: 6361059
Mohan,

I could combine the two functionalities within the same class and thanks a lot for your help.

Bijoy.
0

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

After being asked a question last year, I went into one of my moods where I did some research and code just for the fun and learning of it all.  Subsequently, from this journey, I put together this article on "Range Searching Using Visual Basic.NET …
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
This tutorial will introduce the viewer to VisualVM for the Java platform application. This video explains an example program and covers the Overview, Monitor, and Heap Dump tabs.
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …
Suggested Courses

971 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question