Criz
Criz

Reputation: 77

Restrict jtextfield to not accept white space as first character

I'm trying to restrict a jtextfield to not accept a white space as its first character. My codes already is restricting the jtextfield to not accept the first input as white space, but I'm stuck on when I input a letter then erase it the restriction of the field to not accept the white space is not working

public class Restriction {

    public Restriction() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Restriction();
            }
        });
    }

    private void initComponents() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextField Field = new JTextField();
        //add filter to document
        ((AbstractDocument) Field.getDocument()).setDocumentFilter(new MyDocumentFilter());
        frame.add(Field);
        frame.pack();
        frame.setVisible(true);
    }
}

class MyDocumentFilter extends DocumentFilter {
    int z=0;
    @Override
    public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
        for (int n = string.length(); n > 0; n--) {//an inserted string may be more than a single character i.e a copy and paste of 'aaa123d', also we iterate from the back as super.XX implementation will put last insterted string first and so on thus 'aa123d' would be 'daa', but because we iterate from the back its 'aad' like we want
            char c = string.charAt(n - 1);//get a single character of the string
            System.out.println(c);
            if(z==0){//for first character
                  if (Character.isAlphabetic(c)) {//if its an alphabetic character or white space
                      super.replace(fb, i, i1, String.valueOf(c), as);//allow update to take place for the given character
                      z++;
                  } else {//it was not an alphabetic character or white space
                      System.out.println("Not allowed");
                  }
            }
            else if(z!=0){
              if (Character.isAlphabetic(c) || c == ' ' || Character.isDigit(c)) {//if its an alphabetic character or white space
                  super.replace(fb, i, i1, String.valueOf(c), as);//allow update to take place for the given character
                  z++;
              } else {//it was not an alphabetic character or white space
                  System.out.println("Not allowed");
              }
            }

        }
    }

    @Override
    public void remove(FilterBypass fb, int i, int i1) throws BadLocationException {
        super.remove(fb, i, i1);
    }

    @Override
    public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException {
        super.insertString(fb, i, string, as);

    }
}

Upvotes: 1

Views: 2946

Answers (2)

Sage
Sage

Reputation: 15408

Try to look into the formattedtextfield java DOC. You can do a lot more than just restricting a white space.

MaskFormatter format = new MaskFormatter("A*********************");
JFormattedTextField fTxtFeild = new JFormattedTextField(format);

The first ? in the MaskFormatter specifies any Any character or number (Character.isLetter or Character.isDigit) and * specifies Anything.

Upvotes: 0

Pshemo
Pshemo

Reputation: 124215

I am not sure if that is what you are trying to achieve but how about changing your replace method to something like

@Override
public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
    //we want standard behavior if we are not placing space at start of JTextField
    //or if we are placing text at start of JTextField but first character is not whitespace
    if ( i!=0 || ( i==0 && !Character.isWhitespace(string.charAt(0)) ) ){
        super.replace(fb, i, i1, string, as);
    }else{
        System.out.println("no spaces allowed");
    }
}

Upvotes: 2

Related Questions