Text Field Max Characters

B

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!!!!

Thanks..

Bruce
 
J

John B. Matthews

bruce said:
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();
}
});
}
}
 
B

bruce

 bruce said:
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
 
M

markspace

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.
 
J

John B. Matthews

markspace said:
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":
 
W

Wojtek

markspace wrote :
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.
 
S

Stanimir Stamenkov

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,596
Members
45,143
Latest member
SterlingLa
Top