Search code examples
javaswingnumbersjtextcomponentdocumentfilter

How to set DocumentFilter with input length and range? e.g. 1-3 or 10-80


I'm using DocumentFilter to restrict input as integer or decimal. And the code I post here is working well for that.

Can anybody help me about how to restrict the input length or range in the given code?

Thanks!!

class MyIntFilter extends DocumentFilter {
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(2);
  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(2);
  sb.append(doc.getText(0, doc.getLength()));
  //sb.append(doc.getText(0, 2));
  sb.delete(offset, offset + length);

  if (test(sb.toString())) {
     super.remove(fb, offset, length);
  } else {
     // warn the user and don't allow the insert
  }

}


}

Solution

  • You may want to test this (as I haven't), but the basic idea should get you started.

    Also check out Document Filter Examples

    As to setting a minimum length, you may want to use a InputVerifier as well

    class MyIntFilter extends DocumentFilter {
    
        private int maxLength = 0;
    
        public void setMaxLength(int maxLength) {
            this.maxLength = maxLength;
        }
    
        public int getMaxLength() {
            return maxLength;
        }
    
        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 (maxLength > 0 && doc.getLength() + string.length() <= maxLength) {
                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(2);
            sb.append(doc.getText(0, doc.getLength()));
            sb.replace(offset, offset + length, text);
    
            if (test(sb.toString())) {
                if (sb.length() > maxLength) {
                    length = sb.length() - maxLength;
                    if (length > 0) {
                        text = text.substring(0, length);
                        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(2);
            sb.append(doc.getText(0, doc.getLength()));
            //sb.append(doc.getText(0, 2));
            sb.delete(offset, offset + length);
    
            if (test(sb.toString())) {
                super.remove(fb, offset, length);
            } else {
                // warn the user and don't allow the insert
            }
    
        }
    }