Text Field Max Characters

Discussion in 'Java' started by bruce, Oct 10, 2010.

  1. bruce

    bruce Guest

    Is there any way to set the maximum number of characters a text field
    can accept? I used setColumns() and then I used validate(). Didn't
    seem to have any effect.

    The only other idea I had was to capture the keystrokes and then test
    the input for the string length I want to limit the field to. In my
    case, that would be overkill!!!!

    Thanks..

    Bruce
    bruce, Oct 10, 2010
    #1
    1. Advertising

  2. In article
    <>,
    bruce <> wrote:

    > Is there any way to set the maximum number of characters a text field
    > can accept? I used setColumns() and then I used validate(). Didn't
    > seem to have any effect.


    These would affect the field's view; you want to limit the number of
    characters permitted in the field's model.

    > The only other idea I had was to capture the keystrokes and then test
    > the input for the string length I want to limit the field to. In my
    > case, that would be overkill!!!!


    It seems straightforward; here's an <http://sscce.org/>:

    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument;

    /** @author John B. Matthews */
    public class ShortDocumentTest extends JPanel {

    private static final int MAX = 8;

    public ShortDocumentTest() {
    this.add(new JTextField(new ShortDocument(), "12345678", MAX));
    }

    private static final class ShortDocument extends PlainDocument {

    @Override
    public void insertString(int offs, String str, AttributeSet a)
    throws BadLocationException {
    if (this.getLength() + str.length() <= MAX) {
    super.insertString(offs, str, a);
    }
    }
    }

    private void display() {
    JFrame f = new JFrame("ShortDocumentTest");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(this);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    }

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

    @Override
    public void run() {
    new ShortDocumentTest().display();
    }
    });
    }
    }
    John B. Matthews, Oct 10, 2010
    #2
    1. Advertising

  3. bruce

    bruce Guest

    On Oct 9, 11:29 pm, "John B. Matthews" <> wrote:
    > In article
    > <>,
    >
    >  bruce <> wrote:
    > > Is there any way to set the maximum number of characters a text field
    > > can accept?  I used setColumns() and then I used validate(). Didn't
    > > seem to have any effect.

    >
    > These would affect the field's view; you want to limit the number of
    > characters permitted in the field's model.
    >
    > > The only other idea I had was to capture the keystrokes and then test
    > > the input for the string length I want to limit the field to.  In my
    > > case, that would be overkill!!!!

    >
    > It seems straightforward; here's an <http://sscce.org/>:
    >
    > import java.awt.EventQueue;
    > import javax.swing.JFrame;
    > import javax.swing.JPanel;
    > import javax.swing.JTextField;
    > import javax.swing.text.AttributeSet;
    > import javax.swing.text.BadLocationException;
    > import javax.swing.text.PlainDocument;
    >
    > /** @author John B. Matthews */
    > public class ShortDocumentTest extends JPanel {
    >
    >     private static final int MAX = 8;
    >
    >     public ShortDocumentTest() {
    >         this.add(new JTextField(new ShortDocument(), "12345678", MAX));
    >     }
    >
    >     private static final class ShortDocument extends PlainDocument {
    >
    >         @Override
    >         public void insertString(int offs, String str, AttributeSet a)
    >                 throws BadLocationException {
    >             if (this.getLength() + str.length() <= MAX) {
    >                 super.insertString(offs, str, a);
    >             }
    >         }
    >     }
    >
    >     private void display() {
    >         JFrame f = new JFrame("ShortDocumentTest");
    >         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    >         f.add(this);
    >         f.pack();
    >         f.setLocationRelativeTo(null);
    >         f.setVisible(true);
    >     }
    >
    >     public static void main(String[] args) {
    >         EventQueue.invokeLater(new Runnable() {
    >
    >             @Override
    >             public void run() {
    >                 new ShortDocumentTest().display();
    >             }
    >         });
    >     }
    >
    > }
    >
    >


    Thanks for the suggestion. I "Sort Of" understand what you have done.
    I'm going to try to convert it to my specific case. I think the meat
    of your example is in the "insertString" which I will need to convert
    to a keystroke, I think. This is one place my "newbie" is showing up..
    I'll play around with it.

    Thanks again for the response...

    Bruce
    bruce, Oct 11, 2010
    #3
  4. bruce

    markspace Guest

    On 10/11/2010 11:13 AM, bruce wrote:

    > Thanks for the suggestion. I "Sort Of" understand what you have done.



    What John did is pretty simple. He just used the .setDocument() method
    of a JTextField to set its underlying document to one that will only
    allow x characters.

    One thing to be careful of when you're doing "key presses" is that I
    don't think Java passes all calls to the document .insert() method
    through some sort of key press filter.

    What if the key press is "Cntl-V" for example, where one key press might
    insert quite a lot of text? What if there is no key press at all, e.g.
    some one selects "Paste" from a menu?

    You might want to show us a bit more realistic example of what you are
    trying to do, I don't think your approach right now is guaranteed to work.
    markspace, Oct 11, 2010
    #4
  5. In article <i8vrav$na3$-september.org>,
    markspace <> wrote:

    > On 10/11/2010 11:13 AM, bruce wrote:
    >
    > > Thanks for the suggestion. I "Sort Of" understand what you have done.

    >
    > What John did is pretty simple. He just used the .setDocument()
    > method of a JTextField to set its underlying document to one that
    > will only allow x characters.


    Exactly; supernumerary characters never get into the Document at all.

    > One thing to be careful of when you're doing "key presses" is that I
    > don't think Java passes all calls to the document .insert() method
    > through some sort of key press filter.
    >
    > What if the key press is "Cntl-V" for example, where one key press
    > might insert quite a lot of text? What if there is no key press at
    > all, e.g. some one selects "Paste" from a menu?


    Although it's orthogonal to extending the Document, one can also
    intercept Document events in a DocumentListener:

    <http://download.oracle.com/javase/tutorial/uiswing/events/documentlistener.html>

    As an aside, I just noticed the malapropism, "DocumentListers":

    <http://download.oracle.com/javase/6/docs/api/javax/swing/text/Document.html#insertString(int,%20java.lang.String,%20javax.swing.text.AttributeSet)>

    > You might want to show us a bit more realistic example of what you are
    > trying to do, I don't think your approach right now is guaranteed to work.


    --
    John B. Matthews
    trashgod at gmail dot com
    <http://sites.google.com/site/drjohnbmatthews>
    John B. Matthews, Oct 12, 2010
    #5
  6. bruce

    Wojtek Guest

    markspace wrote :
    > On 10/11/2010 11:13 AM, bruce wrote:
    >
    >> Thanks for the suggestion. I "Sort Of" understand what you have done.

    >
    >
    > What John did is pretty simple. He just used the .setDocument() method of a
    > JTextField to set its underlying document to one that will only allow x
    > characters.
    >
    > One thing to be careful of when you're doing "key presses" is that I don't
    > think Java passes all calls to the document .insert() method through some
    > sort of key press filter.
    >
    > What if the key press is "Cntl-V" for example, where one key press might
    > insert quite a lot of text? What if there is no key press at all, e.g. some
    > one selects "Paste" from a menu?
    >
    > You might want to show us a bit more realistic example of what you are trying
    > to do, I don't think your approach right now is guaranteed to work.


    And you have to watch special operations such as "Delete" and
    "Backspace". If your character count is full, you still need to allow
    certain characters through.

    --
    Wojtek :)
    Wojtek, Oct 13, 2010
    #6
  7. Sat, 9 Oct 2010 18:51:05 -0700 (PDT), /bruce/:

    > Is there any way to set the maximum number of characters a text field
    > can accept? I used setColumns() and then I used validate(). Didn't
    > seem to have any effect.
    >
    > The only other idea I had was to capture the keystrokes and then test
    > the input for the string length I want to limit the field to. In my
    > case, that would be overkill!!!!


    You may also look at javax.swing.text.DocumentFilter:

    http://download.oracle.com/javase/6/docs/api/javax/swing/text/DocumentFilter.html

    http://download.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter

    --
    Stanimir
    Stanimir Stamenkov, Oct 13, 2010
    #7
  8. bruce

    bruce Guest

    On Oct 13, 5:19 pm, Stanimir Stamenkov <> wrote:
    > Sat, 9 Oct 2010 18:51:05 -0700 (PDT), /bruce/:
    >
    > > Is there any way to set the maximum number of characters a text field
    > > can accept?  I used setColumns() and then I used validate(). Didn't
    > > seem to have any effect.

    >
    > > The only other idea I had was to capture the keystrokes and then test
    > > the input for the string length I want to limit the field to.  In my
    > > case, that would be overkill!!!!

    >
    > You may also look at javax.swing.text.DocumentFilter:
    >
    > http://download.oracle.com/javase/6/docs/api/javax/swing/text/Documen...
    >
    > http://download.oracle.com/javase/tutorial/uiswing/components/general...
    >
    > --
    > Stanimir


    Thanks for the response.

    Bruce
    bruce, Oct 14, 2010
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Summercool
    Replies:
    9
    Views:
    871
    dorayme
    Oct 23, 2007
  2. Greg Ferris

    Textarea max rows and max characters per row

    Greg Ferris, Jan 16, 2004, in forum: Javascript
    Replies:
    2
    Views:
    567
    Greg Ferris
    Jan 16, 2004
  3. kriton
    Replies:
    0
    Views:
    329
    kriton
    Apr 22, 2005
  4. Sound
    Replies:
    2
    Views:
    430
    Randy Webb
    Sep 28, 2006
  5. jr
    Replies:
    3
    Views:
    409
Loading...

Share This Page