Search code examples
javaswingjtextfieldrestrictiondigits

How to allow introducing only digits in jTextField?


I have tried to use the example shown here but java showing error message of

"AttributeSet cannot be resolved to a type"

That is why I am trying to use another method of allowing only digits:

txtUsername.addKeyListener(new MyKeyListener());

public class MyKeyListener extends KeyAdapter{
  public void keyPressed(KeyEvent ke){
      System.out.println("Key pressed code = "+ke.getKeyCode());
      if (ke.getKeyCode()>=48 && ke.getKeyCode()<=57)
              return true;
      else
              return false;
  }
} 

But of course it is not working because keyPressed method is void. So, what to do in order to print only digits in textfield?


Solution

  • Here check this code snippet, that's how you allow only digits in JTextField, by using DocumentFilter, as the most effeciive way :

    import java.awt.*;
    import javax.swing.*;
    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 InputInteger
    {
        private JTextField tField;
        private MyDocumentFilter documentFilter;
    
        private void displayGUI()
        {
            JFrame frame = new JFrame("Input Integer Example");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
            JPanel contentPane = new JPanel();
            contentPane.setBorder(
                BorderFactory.createEmptyBorder(5, 5, 5, 5));
            tField = new JTextField(10);
            ((AbstractDocument)tField.getDocument()).setDocumentFilter(
                    new MyDocumentFilter());        
            contentPane.add(tField); 
    
            frame.setContentPane(contentPane);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String[] args)
        {
            Runnable runnable = new Runnable()
            {
                @Override
                public void run()
                {
                    new InputInteger().displayGUI();
                }
            };
            EventQueue.invokeLater(runnable);
        }
    }
    
    class MyDocumentFilter extends DocumentFilter
    {   
        @Override
        public void insertString(DocumentFilter.FilterBypass fp
                , int offset, String string, AttributeSet aset)
                                    throws BadLocationException
        {
            int len = string.length();
            boolean isValidInteger = true;
    
            for (int i = 0; i < len; i++)
            {
                if (!Character.isDigit(string.charAt(i)))
                {
                    isValidInteger = false;
                    break;
                }
            }
            if (isValidInteger)
                super.insertString(fp, offset, string, aset);
            else
                Toolkit.getDefaultToolkit().beep();
        }
    
        @Override
        public void replace(DocumentFilter.FilterBypass fp, int offset
                        , int length, String string, AttributeSet aset)
                                            throws BadLocationException
        {
            int len = string.length();
            boolean isValidInteger = true;
    
            for (int i = 0; i < len; i++)
            {
                if (!Character.isDigit(string.charAt(i)))
                {
                    isValidInteger = false;
                    break;
                }
            }
            if (isValidInteger)
                super.replace(fp, offset, length, string, aset);
            else
                Toolkit.getDefaultToolkit().beep();
        }
    }
    

    Or one can simply use this approach, as given by @Carlos Heuberger

    @Override
    public void insertString(FilterBypass fb, int off
                        , String str, AttributeSet attr) 
                                throws BadLocationException 
    {
        // remove non-digits
        fb.insertString(off, str.replaceAll("\\D++", ""), attr);
    } 
    @Override
    public void replace(FilterBypass fb, int off
            , int len, String str, AttributeSet attr) 
                            throws BadLocationException 
    {
        // remove non-digits
        fb.replace(off, len, str.replaceAll("\\D++", ""), attr);
    }