Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Text Field Max Characters

54 views
Skip to first unread message

bruce

unread,
Oct 9, 2010, 9:51:05 PM10/9/10
to
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

John B. Matthews

unread,
Oct 9, 2010, 11:29:36 PM10/9/10
to
In article
<683f43c0-6f81-423c...@n16g2000vbg.googlegroups.com>,
bruce <bru...@bellsouth.net> 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();
}
});
}
}

bruce

unread,
Oct 11, 2010, 2:13:05 PM10/11/10
to
On Oct 9, 11:29 pm, "John B. Matthews" <nos...@nospam.invalid> wrote:
> In article
> <683f43c0-6f81-423c-aa7d-99d39c81d...@n16g2000vbg.googlegroups.com>,

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

markspace

unread,
Oct 11, 2010, 4:16:28 PM10/11/10
to
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.


John B. Matthews

unread,
Oct 11, 2010, 11:44:44 PM10/11/10
to
In article <i8vrav$na3$1...@news.eternal-september.org>,
markspace <nos...@nowhere.com> 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>

Wojtek

unread,
Oct 13, 2010, 2:11:50 PM10/13/10
to
markspace wrote :

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 :-)


Stanimir Stamenkov

unread,
Oct 13, 2010, 5:19:34 PM10/13/10
to
Sat, 9 Oct 2010 18:51:05 -0700 (PDT), /bruce/:

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

bruce

unread,
Oct 13, 2010, 8:12:25 PM10/13/10
to
On Oct 13, 5:19 pm, Stanimir Stamenkov <s7a...@netscape.net> 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

0 new messages