Restricting a Java Text field to Integers

Thursday, April 10, 2014 0 Comments

I have read a lot for this and the best way I found to do this is by extending the DocumentFilter class and using this new DocumentFilter
class MyIntFilter extends DocumentFilter {
 @Override
 public void insertString(FilterBypass fb, int offset, String string,
 AttributeSet attr) throws BadLocationException {
 Document doc = fb.getDocument();
 StringBuilder sb = new StringBuilder();
 sb.append(doc.getText(0, doc.getLength()));
 sb.insert(offset, string);
 if (test(sb.toString())) {
 super.insertString(fb, offset, string, attr);
 } else {
 // warn the user and don't allow the insert
 }
 }
 private boolean test(String text) {
 try {
 Integer.parseInt(text);
 return true;
 } catch (NumberFormatException e) {
 return false;
 }
 }
 @Override
 public void replace(FilterBypass fb, int offset, int length, String text,
 AttributeSet attrs) throws BadLocationException {
 Document doc = fb.getDocument();
 StringBuilder sb = new StringBuilder();
 sb.append(doc.getText(0, doc.getLength()));
 sb.replace(offset, offset + length, text);
 if (test(sb.toString())) {
 super.replace(fb, offset, length, text, attrs);
 } else {
 // warn the user and don't allow the insert
 }
 }
 @Override
 public void remove(FilterBypass fb, int offset, int length)
 throws BadLocationException {
 Document doc = fb.getDocument();
 StringBuilder sb = new StringBuilder();
 sb.append(doc.getText(0, doc.getLength()));
 sb.delete(offset, offset + length);
 if (test(sb.toString())) {
 super.remove(fb, offset, length);
 } else {
 // warn the user and don't allow the insert
 }
 }
}
Now after this use this filter with your JtextField like below:
PlainDocument doc = (PlainDocument) textField.getDocument();
doc.setDocumentFilter(new MyIntFilter());

0 comments:

Subscribe to: Post Comments (Atom)