jTextField validation for numbers and one decimal point?

前端 未结 5 1391
被撕碎了的回忆
被撕碎了的回忆 2020-12-20 02:52

I need to set a jTextField to accept only numbers and one decimal point.Nothing else. Decimal point can\'t be typed more than once and no other characters are allowed. How c

相关标签:
5条回答
  • 2020-12-20 03:23

    You appear to be using a KeyListener to manage KeyEvents in theJTextField. This is not a suitable for filtering the document of this JTextComponent. Here you could use a JFormattedTextField combined with a MaskFormatter to accept a maximum 8 digits separated by a decimal point.

    JFormattedTextField textField = new JFormattedTextField();
    MaskFormatter dateMask = new MaskFormatter("####.####");
    dateMask.install(textField);
    

    For a more free-format input (e.g. more digits) you could use a DocumentFilter with a JTextField. Here is an integer filter example

    0 讨论(0)
  • 2020-12-20 03:28

    Very good question! I downloaded this code (I can't remember which site it was) a long time ago which allows you to enter only a numbers:

    import java.awt.Color;
    import javax.swing.JTextField;
    import javax.swing.text.*;
    
    public class JNumericField extends JTextField {
        private static final long serialVersionUID = 1L;
    
        private static final char DOT = '.';
        private static final char NEGATIVE = '-';
        private static final String BLANK = "";
        private static final int DEF_PRECISION = 2;
    
        public static final int NUMERIC = 2;
        public static final int DECIMAL = 3;
    
        public static final String FM_NUMERIC = "0123456789";
        public static final String FM_DECIMAL = FM_NUMERIC + DOT; 
    
        private int maxLength = 0;
        private int format = NUMERIC;
        private String negativeChars = BLANK;
        private String allowedChars = null;
        private boolean allowNegative = false;
        private int precision = 0;
    
        protected PlainDocument numberFieldFilter;
    
        public JNumericField() {
    
            this(2, DECIMAL);
        }
    
        public JNumericField(int iMaxLen) {
            this(iMaxLen, NUMERIC);
        }
    
        public JNumericField(int iMaxLen, int iFormat) {
            setAllowNegative(true);
            setMaxLength(iMaxLen);
            setFormat(iFormat);
    
            numberFieldFilter = new JNumberFieldFilter();
            super.setDocument(numberFieldFilter);
        }
    
        public void setMaxLength(int maxLen) {
            if (maxLen > 0)
                maxLength = maxLen;
            else
                maxLength = 0;
        }
    
        public int getMaxLength() {
            return maxLength;
        }
    
        public void setEnabled(boolean enable) {
            super.setEnabled(enable);
    
            if (enable) {
                setBackground(Color.white);
                setForeground(Color.black);
            } else {
                setBackground(Color.lightGray);
                setForeground(Color.darkGray);
            }
        }
    
        public void setEditable(boolean enable) {
            super.setEditable(enable);
    
            if (enable) {
                setBackground(Color.white);
                setForeground(Color.black);
            } else {
                setBackground(Color.lightGray);
                setForeground(Color.darkGray);
            }
        }
    
        public void setPrecision(int iPrecision) {
            if (format == NUMERIC)
                return;
    
            if (iPrecision >= 0)
                precision = iPrecision;
            else
                precision = DEF_PRECISION;
        }
    
        public int getPrecision() {
            return precision;
        }
    
        public Number getNumber() {
            Number number = null;
            if (format == NUMERIC)
                number = new Integer(getText());
            else
                number = new Double(getText());
    
            return number;
        }
    
        public void setNumber(Number value) {
            setText(String.valueOf(value));
        }
    
        public int getInt() {
            return Integer.parseInt(getText());
        }
    
        public void setInt(int value) {
            setText(String.valueOf(value));
        }
    
        public float getFloat() {
            return (new Float(getText())).floatValue();
        }
    
        public void setFloat(float value) {
            setText(String.valueOf(value));
        }
    
        public double getDouble() {
            return (new Double(getText())).doubleValue();
        }
    
        public void setDouble(double value) {
            setText(String.valueOf(value));
        }
    
        public int getFormat() {
            return format;
        }
    
        public void setFormat(int iFormat) {
            switch (iFormat) {
            case NUMERIC:
            default:
                format = NUMERIC;
                precision = 0;
                allowedChars = FM_NUMERIC;
                break;
    
            case DECIMAL:
                format = DECIMAL;
                precision = DEF_PRECISION;
                allowedChars = FM_DECIMAL;
                break;
            }
        }
    
        public void setAllowNegative(boolean b) {
            allowNegative = b;
    
            if (b)
                negativeChars = "" + NEGATIVE;
            else
                negativeChars = BLANK;
        }
    
        public boolean isAllowNegative() {
            return allowNegative;
        }
    
        public void setDocument(Document document) {
        }
    
        class JNumberFieldFilter extends PlainDocument {
            private static final long serialVersionUID = 1L;
    
            public JNumberFieldFilter() {
                super();
            }
    
            public void insertString(int offset, String str, AttributeSet attr)
                    throws BadLocationException {
                String text = getText(0, offset) + str
                        + getText(offset, (getLength() - offset));
    
                if (str == null || text == null)
                    return;
    
                for (int i = 0; i < str.length(); i++) {
                    if ((allowedChars + negativeChars).indexOf(str.charAt(i)) == -1)
                        return;
                }
    
                int precisionLength = 0, dotLength = 0, minusLength = 0;
                int textLength = text.length();
    
                try {
                    if (format == NUMERIC) {
                        if (!((text.equals(negativeChars)) && (text.length() == 1)))
                            new Long(text);
                    } else if (format == DECIMAL) {
                        if (!((text.equals(negativeChars)) && (text.length() == 1))) 
                            new Double(text);
    
                        int dotIndex = text.indexOf(DOT);
                        if (dotIndex != -1) {
                            dotLength = 1;
                            precisionLength = textLength - dotIndex - dotLength;
    
                            if (precisionLength > precision)
                                return;
                        }
                    }
                } catch (Exception ex) {
                    return;
                }
    
                if (text.startsWith("" + NEGATIVE)) {
                    if (!allowNegative)
                        return;
                    else
                        minusLength = 1;
                }
    
                if (maxLength < (textLength - dotLength - precisionLength - minusLength))
                    return;
    
                super.insertString(offset, str, attr);
            }
        }
    }
    

    You will use it in this way:

    JNumericField numField = new JNumericField();
    
    numField.setMaxLength(10); //Set maximum length             
    numField.setPrecision(1); //Set precision (1 in your case)              
    numField.setAllowNegative(true); //Set false to disable negatives
    
    0 讨论(0)
  • 2020-12-20 03:29
       if(!Character.isDigit(evt.getKeyChar())&&evt.getKeyChar()!='.'){
           evt.consume();
       } 
       if(evt.getKeyChar()=='.'&&jTextField1.getText().contains(".")){
          evt.consume();
           }   
    
    0 讨论(0)
  • 2020-12-20 03:34

    You can do simple validation for your JTextField....

    JTextField.addKeyListener(new java.awt.event.KeyAdapter() {
      public void keyTyped(java.awt.event.KeyEvent evt) {
    
        char text[];
            int count = 0; 
            text = JTextField.getText().toCharArray();
            for(int i = 0 ; i< text.length ; i++){
                if(text[i] == '.'){
                    count++;
                }
            }
            if(count>=1 && evt.getKeyChar() == '.'){
                evt.consume();
            }
    
      }
    });
    
    0 讨论(0)
  • 2020-12-20 03:42
    char c=evt.getKeyChar();
    if(!(Character.isDigit(c)||
        (c==KeyEvent.VK_BACK_SPACE)||c==KeyEvent.VK_DELETE||evt.getKeyChar() == '.')){
    //  evt.getKeyChar() == '.' does accept point when jtextfield accepts decimal number
      evt.consume();
      getToolkit().beep();
    }
    
    0 讨论(0)
提交回复
热议问题