完美實現控制文字框只能輸入(包括鍵入和貼上)數字和至多一個小數點
阿新 • • 發佈:2019-01-30
注:本文程式碼的核心部分非本人原創,是引用的,參見地址http://biancheng.dnbcw.info/java/247881.html,我改正並完善了他的使用方法,並寫了介紹和總結。
1、只能輸入數字和至多一個小數點,不能輸入字母等其他符號(第一個可以是負號);
2、第一個符號不能是小數點;
3、當第一個符號是負號時,第二個符號不能是小數點;
4、當輸入其他符號時,不顯示,並且蜂鳴一聲進行提示;
5、控制輸入包括控制鍵入和貼上。
綜上所述,輸入的控制完全符合一個普通方法表示的十進位制數字。並且同時控制了鍵入和貼上。並且輸入錯誤時給予蜂鳴提醒。
完美!
PS:上述情況是可以輸入負數的情況,如果想只允許輸入正數,不允許輸入負數,在下面的下面給出了程式碼。
下面給出使用方法:(可以輸入負數的)
(不可以輸入負數的)import javax.swing.JFrame; import javax.swing.JTextField; import java.awt.Toolkit; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; class DecimalOnlyDocument extends PlainDocument { @Override public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { StringBuffer tmp = new StringBuffer(super.getText(0, super.getLength())); tmp.insert(offs, str); Pattern p = Pattern.compile("^-?\\d*(\\.)?\\d*$"); Matcher m = p.matcher(tmp.toString()); if (m.find()) { super.insertString(offs, str, a); } else Toolkit.getDefaultToolkit().beep();// 蜂鳴器響一聲 } } public class CeShi extends JFrame { JTextField text = new JTextField(); public CeShi() { text.setDocument(new DecimalOnlyDocument()); this.add(text); this.setSize(100, 100); this.setVisible(true); } public static void main(String[] args) { new CeShi(); } }
import java.awt.Toolkit; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; /** * * @author Administrator */ //注:此類沒有檢查負號,即不能輸入負數,使用下面的正則表示式則可優雅地處理各種情況 //方法1: public class DecimalOnlyDocument extends PlainDocument { private boolean dot = false;//true:已經有小數點 0:還沒有小數點 @Override public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { if ((super.getText(0, super.getLength())).indexOf('.') == -1) {//檢查原來文字框是否已經有小數點 dot = false; } else { dot = true; } for (int i = 0; i < str.length(); i++) { if (str.charAt(i) < '0' || str.charAt(i) > '9') { if (str.charAt(i) != '.' || dot) { Toolkit.getDefaultToolkit().beep();//蜂鳴器響一聲 return;//非小數點的字母或者已經有小數點,返回 } else dot = true; } } if (str.indexOf('.') != -1)//控制第一個字元不可以為小數點,如果沒有這兩行,則第一個字元可以為小數點 dot = true; super.insertString(offs, str, a); } }