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
> 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
> 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.
> 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":
> 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>
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 :-)
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
Thanks for the response.
Bruce