jTextField accept only alphabet and white space

18,319

Solution 1

Use a DocumentFilter, here is an example I made, it will only accept alphabetic characters and white spaces:

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class Test {

    public Test() {
        initComponents();
    }

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

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

        JTextField jtf = new JTextField();
        //add filter to document
        ((AbstractDocument) jtf.getDocument()).setDocumentFilter(new MyDocumentFilter());

        frame.add(jtf);

        frame.pack();
        frame.setVisible(true);
    }
}

class MyDocumentFilter extends DocumentFilter {

    @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 (Character.isAlphabetic(c) || 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
            } 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);

    }
}

Solution 2

You have a semicolon on the end of the first line. So it is not really testing correctly.

A statement like this (which is what you have):

if (condition) ;

will execute the empty statement (;) if the condition is true and then go to the next line. If the condition is false, it will just go to the next line. These two actions have the same result.

You might try using braces on all "if" statements. It is tedious at times but makes it harder to mess up.

if (!(Pattern.matches("^[a-zA-Z]+$", answerField1.getText()))) {
    JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);
}

That's what I would do. You can just erase the semicolon.

Share:
18,319
mxyz
Author by

mxyz

Updated on June 05, 2022

Comments

  • mxyz
    mxyz almost 2 years

    i want user to enter only alphabet or white space if user enters other character , i want give message with jOptionPane i have searched and i tried the below code

    if (!(Pattern.matches("^[a-zA-Z]+$", answerField1.getText())))
            JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);
    

    but now whatever i enter it gives the error

    now i changed the code

    Pattern letterPattern = Pattern.compile("^[a-zA-Z]+$");
    
    if (!(letterPattern.matcher(answerField1.getText()).matches()))
          {
        JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);
    }
    

    now it gives message only firs time user enters number . how can i solve this

  • Lee Meador
    Lee Meador over 11 years
    oh, yes. You don't have a space in the square braces of the regular expression so no spaces are allowed. That may be a copy problem (or not).
  • Lee Meador
    Lee Meador over 11 years
    1) Try single stepping through with a debugger. Its easier to see what is happening if you make some local variables for the text value and the result of the match() call.
  • Lee Meador
    Lee Meador over 11 years
    2) Test your regular expression here (click) to see if its working as you think.