A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 许涛 黑马帝   /  2012-5-19 05:19  /  1947 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 许涛 于 2012-5-19 05:21 编辑

这是一段文本框键盘监听代码,需求是:限定文本框中只能输入0~9数字,限制数字之外的非法字符的输入,以下代码虽然能限制字母的输入,但是 !@#$ 等字符依旧能进入文本框(也就是shift+1,2,3...),原因是什么呢?求代码改进,谢谢
  1. TextField tf = new TextField(20);

  2. public void myEvent(){
  3.         tf.addKeyListener(new KeyAdapter(){

  4.                 public void keyPressed(KeyEvent e){
  5.                         if(!(e.getKeyCode()>=KeyEvent.VK_0 && e.getKeyCode()<=KeyEvent.VK_9))
  6.                                 e.consume();
  7.                 }
  8.         });
  9. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

4 个回复

正序浏览
本帖最后由 刘蕴学 于 2012-5-19 15:20 编辑

总算来个有意思的帖子了

这个是你要的
  1. public void keyPressed(KeyEvent e)
  2.                         {
  3.                                 e.consume();
  4.                                 if ((e.getModifiers() == 0) && (e.getKeyCode() >= KeyEvent.VK_0 && e.getKeyCode() <= KeyEvent.VK_9))
  5.                                 {
  6.                                        
  7.                                        
  8.                                 }
  9.                         }
复制代码
这个是另外一种办法
  1. public class Document extends javax.swing.text.PlainDocument
  2. {

  3.         public static void main(String[] args)
  4.         {
  5.                 JTextField jTextField = new JTextField();
  6.                 Document document = new Document();
  7.                 //[a-zA-Z0-9\u4e00-\u9fa5]
  8.                 //简单的正则表达式,这你不用管,0-9是限制只有数字
  9.                 //a-z是小写字母,\\u那个是中文
  10.                 document.setCharLimit("[0-9]");
  11.                 jTextField.setDocument(document);
  12.                 //这样就限制能输入数字了
  13.         }
  14.         

  15.         private static final long serialVersionUID = -4462693078138709956L;
  16.          
  17.         private String limit = ""; // 输入字符限制的正则表达式
  18.          
  19.         private int maxLength = -1; // 输入字符最大长度的限制,-1为不限制
  20.         
  21.         private double maxValue = 0; // 如果输入的是数字,则最大值限制
  22.         
  23.         private boolean isMaxValue = false; // 是否采用了最大值限制
  24.         
  25.         private java.awt.Toolkit toolkit = null; // 用来在错误的时候发出系统声音
  26.         
  27.         private boolean beep = false; // 是否发声,true为发出声音
  28.         
  29.         // 构造方法
  30.         
  31.         public Document()
  32.         {
  33.                 super();
  34.                 this.init();
  35.         }
  36.         
  37.         public Document(Content c)
  38.         {
  39.                 super(c);
  40.                 this.init();
  41.         }
  42.         
  43.         /**
  44.          * 所有构造都需要的公共方法
  45.          */
  46.         private void init()
  47.         {
  48.                 toolkit = java.awt.Toolkit.getDefaultToolkit();
  49.         }
  50.         
  51.         // 构造方法结束
  52.          
  53.         /**
  54.          * 设置字符限制条件[a-zA-Z0-9\u4e00-\u9fa5]
  55.          *
  56.          * @param limit
  57.          *            限制条件 参考正则表达式 java.util.regex.Pattern
  58.          */
  59.         public void setCharLimit(String limit)
  60.         {
  61.                 this.limit = limit;
  62.         }
  63.         
  64.         /**
  65.          * 返回字符限制的条件
  66.          *
  67.          * @return 条件
  68.          */
  69.         public String getCharLimit()
  70.         {
  71.                 return this.limit;
  72.         }
  73.         
  74.         /**
  75.          * 清除所有限制字符
  76.          */
  77.         public void clearLimit()
  78.         {
  79.                 this.limit = null;
  80.         }
  81.         
  82.         /**
  83.          * 字符输入限制是否包含该字符
  84.          *
  85.          * @param input
  86.          *            字符
  87.          * @return true为包含,false为不包含
  88.          */
  89.         public boolean isOfLimit(CharSequence input)
  90.         {
  91.                 if (limit == null)
  92.                 {
  93.                 return true;
  94.                 }
  95.                 else
  96.                 {
  97.                 return java.util.regex.Pattern.compile(limit).matcher(input).find();
  98.                 }
  99.         }
  100.         
  101.         /**
  102.          * 字符输入的限制组是否为空
  103.          *
  104.          * @return true为空,false为有
  105.          */
  106.         public boolean isEmptyLimit()
  107.         {
  108.                 if (limit == null)
  109.                 {
  110.                 return true;
  111.                 }
  112.                 else
  113.                 {
  114.                 return false;
  115.                 }
  116.         }
  117.         
  118.         /**
  119.          * 设置文本框所允许输入的最大字符长度
  120.          *
  121.          * @param maxLength
  122.          *            最大字符长度
  123.          */
  124.         public void setMaxLength(int maxLength)
  125.         {
  126.                 this.maxLength = maxLength;
  127.         }
  128.         
  129.         /**
  130.          * 取消文本框最大字符长度的限制
  131.          */
  132.         public void cancelMaxLength()
  133.         {
  134.                 this.maxLength = -1;
  135.         }
  136.         
  137.         /**
  138.          * 如果输入的为纯数字,则可用此方法来设置数字的最大值
  139.          *
  140.          * @param maxValue
  141.          *            最大值
  142.          */
  143.         public void setMaxValue(double maxValue)
  144.         {
  145.                 this.isMaxValue = true;
  146.                 this.maxValue = maxValue;
  147.         }
  148.         
  149.         /**
  150.          * 文本框是否限制了数字内容的最大数值
  151.          *
  152.          * @return true为限制了
  153.          */
  154.         public boolean isMaxValue()
  155.         {
  156.                 return this.isMaxValue;
  157.         }
  158.         
  159.         /**
  160.          * 返回限制数字内容最大值
  161.          *
  162.          * @return double类最大值,如果没有限制会返回0
  163.          */
  164.         public double getMaxValue()
  165.         {
  166.                 return this.maxValue;
  167.         }
  168.         
  169.         /**
  170.          * 取消数字内容的最大值设置
  171.          */
  172.         public void cancelMaxValue()
  173.         {
  174.                 this.isMaxValue = false;
  175.                 this.maxValue = 0;
  176.         }
  177.         
  178.         /**
  179.          * 使所有限制设置恢复默认
  180.          */
  181.         public void reset()
  182.         {
  183.                 clearLimit();
  184.                 cancelMaxLength();
  185.                 cancelMaxValue();
  186.         }
  187.         
  188.         /**
  189.          * 错误时发声开关
  190.          *
  191.          * @param beep
  192.          *            true为发声音
  193.          */
  194.         public void errorBeep(boolean beep)
  195.         {
  196.                 this.beep = beep;
  197.         }
  198.         
  199.         /**
  200.          * 输入错误时是否发声
  201.          *
  202.          * @return boolean true为发声
  203.          */
  204.         public boolean isErrorBeep()
  205.         {
  206.                 return beep;
  207.         }
  208.         
  209.         public void insertString(int offs, String str, javax.swing.text.AttributeSet a) throws javax.swing.text.BadLocationException, NumberFormatException
  210.         {
  211.                 // 若字符串为空,直接返回。
  212.                 if (str == null)
  213.                 {
  214.                         return;
  215.                 }
  216.                 boolean b = true;
  217.                 char[] ch = str.toCharArray();
  218.                 for (int i = 0; i < ch.length; i++)
  219.                 {
  220.                         String temp = String.valueOf(ch[i]);
  221.                         // 如果要输入的字符不在允许范围内
  222.                         if (!isOfLimit(temp))
  223.                         {
  224.                                 b = false;
  225.                         }
  226.                         
  227.                         // 如果有字符长度限制,并且现在的字符长度已经大于或等于限制
  228.                         if (maxLength > -1 && this.getLength() >= maxLength)
  229.                         {
  230.                                 b = false;
  231.                         }
  232.                 }
  233.                 // 如果内容设置了最大数字
  234.                 if (isMaxValue)
  235.                 {
  236.                         String s = this.getText(0, this.getLength()); // 文档中已有的字符
  237.                         s = s.substring(0, offs) + str + s.substring(offs, s.length());
  238.                         if (Double.parseDouble(s) > maxValue)
  239.                         {
  240.                                 if (beep)
  241.                                 {
  242.                                         toolkit.beep(); // 发出声音
  243.                                 }
  244.                                 return;
  245.                         }
  246.                 }
  247.                   
  248.                 // 如果输入不合法
  249.                 if(!b)
  250.                 {
  251.                         if (beep)
  252.                         {
  253.                                 toolkit.beep(); // 发出声音
  254.                         }
  255.                         return;
  256.                 }
  257.                
  258.                 super.insertString(offs, new String(ch), a);
  259.         }

  260. }
复制代码

点评

如此用心,无以言表,唯有感谢!  发表于 2012-5-20 07:02

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 长就一个字 我只说一次

查看全部评分

回复 使用道具 举报
用输入法输入数字字母也是检测不到滴哦。。
回复 使用道具 举报
因为要输入数字与输入你所说的特殊字符时按的键是同一个键,只不过输入特殊字符时要按下shift键,你可以在if语句上加一句System.out.println(e.getkeyCode());这样你就会看到你所按的键的值,但你输入1时所按的键值是49,输入!时所按的键值为16   49,符合if条件,所以能输进去,另外,在输入时必须是英文输入法才行,若是中文输入法,则能输入汉字而且不会显示键值。

点评

说的在理,中文输入法的问题我倒没想到,又学习了,谢谢。  发表于 2012-5-20 07:00
回复 使用道具 举报
个人认为应该在接受键值时他是判断shift是否被按下在输出值,也就是说你按下a+1是显示1.但你按下shift+1显示!一样,他不会去判断按了a没,却判断shift键按下没,所以加上一句 if(!(!e.isShiftDown()&&e.getKeyCode()>=KeyEvent.VK_0 && e.getKeyCode()<=KeyEvent.VK_9))中的!e.isShiftDown(),当按下shift键时不去显示值。这样就只能显示数字了!

点评

谢谢,此方法确实可行。  发表于 2012-5-20 07:00
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马