2

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 can I do this?

I typed this code. but it doesn't work well. I mean it accept Strings until i type a decimal point

 if (!Character.isDigit(evt.getKeyChar()) & crqty.getText().indexOf(".") != -1) { evt.consume(); } 

5 Answers 5

4

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

Sign up to request clarification or add additional context in comments.

2 Comments

I'm new to java. Could you please explain this more? I mean where should I type this code?
You can either completely replace your JTextField with a fixed input JFormattedTextField or use a DocumentFilter with a JTextField similar to that shown in the example :)
3

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 

Comments

0

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(); } } }); 

Comments

0
 if(!Character.isDigit(evt.getKeyChar())&&evt.getKeyChar()!='.'){ evt.consume(); } if(evt.getKeyChar()=='.'&&jTextField1.getText().contains(".")){ evt.consume(); } 

1 Comment

Thank you for this answer. However, it would be better if you added some explanations, not just code.
-1
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(); } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.