Java 版 (精华区)

发信人: DreamWeaver (猪头小队长), 信区: Java
标  题: 代码示例:在JTextField中限制用户输入
发信站: 哈工大紫丁香 (2003年03月25日14:57:25 星期二), 转信

http://www.cn-java.com/forum/show_topic.php?forum_id=4&topic_id=8815

写数据库应用时很有用的。如果要其它的限制,仿照下面的代码自己写吧。 

package com.zhongxing.client.atm; 

import javax.swing.text.*; 
/** 
 * <p>Title: </p> 
 * <p>Description: 多风格文本文档,用途:作为JTextField的数据模型。风格包括: 
 * 长度限制、只允许数字、只允许数字时是否允许负值符号、是否允许引号字符(单引 
 * 号和双引号)。这里的长度指字节长度,如果长度限制为 0 ,则表示没有长度限制。 
 * 
 * 使用例子: 
 * JTextField textField1 = new JTextField( 
 *   new ZXB10Document(ZXB10Document.LENGTH_LIMIT, 5), "", 5); 
 * 为textField1设置 长度限制为5个字节的风格。 
 * 
 * 或: 
 * textField1.setDocument( 
 *  new ZXB10Document(ZXB10Document.LENGTH_LIMIT | ZXB10Document.DIGITAL, 10)); 
 * 为textField1设置为 只允许输入数字,不允许是负值,长度限制为10个字节的风格。 
 * 
 * 注意:允许输入的数字是英文输入法下输入的ASCII字符,一个数字字符占一个字节。 
 * 如果在中文输入法下输入的数字,系统将不认为是数字,并且一个字符占两个字节。 
 * 
 * </p> 
 * <p>Copyright: Copyright (c) 2002</p> 
 * <p>Company: 中兴通讯</p> 
 * @author throw_exception 
 * @version 1.0 
 */ 

public class ZXB10Document extends PlainDocument { 
    /** 
     * 普通风格。 
     */ 
    public final static int PLAIN           = 0x00; 

    /** 
     * 长度限制风格。 
     */ 
    public final static int LENGTH_LIMIT    = 0x01; 

    /** 
     * 只允许数字风格,默认是非负的。 
     */ 
    public final static int DIGITAL         = 0x02; 

    /** 
     * 允许为负值。只有文档已经被设置了 DIGITAL 风格时有效。 
     */ 
    public final static int ALLOW_NEGATIVE  = 0x04; 

    /** 
     * 是否允许引号。当文档被设置为 DIGITAL 风格时,本风格无效。 
     */ 
    public final static int QUOTE_FILTED    = 0x08; 

    protected int style = PLAIN; 
    protected int limit = 0; 

    /** 
     * 创建普通风格,没有长度限制的文档。 
     */ 
    public ZXB10Document() { 
        this(PLAIN, 0); 
    } 

    /** 
     * 创建指定风格的文档,没有长度限制。 
     * @param style 指定的风格,可以是各种风格的组合。 
     */ 
    public ZXB10Document(int style) { 
        this(style, 0); 
    } 

    /** 
     * 创建指定风格的文档,有长度限制。 
     * @param style 指定的风格,可以是各种风格的组合。 
     * @param lengthLimit 指定的长度,大于或等于0。等于 0 时表示无长度限制。 
     */ 
    public ZXB10Document(int style, int lengthLimit) { 
        setLengthLimit(lengthLimit); 
        this.style = style; 
    } 

    /** 
     * 设置指定的风格。 
     * @param style 指定的风格,将替换原来的风格。 
     */ 
    public void setStyle(int style) { 
        this.style = style; 
    } 

    /** 
     * 增加指定的风格。 
     * @param style 指定的风格,将添加到原来的风格之上。 
     */ 
    public void addStyle(int style) { 
        this.style = this.style | style; 
    } 

    /** 
     * 删除指定的风格。 
     * @param style 指定的风格,从原来的风格上删除这种风格。 
     */ 
    public void removeStyle(int style) { 
        this.style = this.style & (~style); 
    } 

    /** 
     * 设置长度限制。 
     * @param lengthLimit 长度限制,大于或等于 0。等于 0 时表示没有长度限制。 
     */ 
    public void setLengthLimit(int lengthLimit) { 
      if(lengthLimit < 0) throw new RuntimeException("Negative length-limit!"); 
      this.limit = lengthLimit; 
    } 

    /** 
     * 有字符串插入文档内容时触发这个方法。覆盖父类的相应方法。 
     * @param offs 
     * @param str 
     * @param a 
     * @throws BadLocationException 
     */ 
    public void insertString(int offs, String str, AttributeSet a) 
                                        throws BadLocationException{ 
        if(str == null) return; 
        String oldStr = getText(0, getLength()); 

        // 有长度限制,如果不满足条件,则返回。 
        if(((style & LENGTH_LIMIT) != 0) && !isLengthPassed(oldStr.
                        getBytes().length + str.getBytes().length)) { 
            return; 
        } 

        // 只允许数字 
        if((style & DIGITAL) != 0) { 
         if(isDigitalPassed(oldStr,offs,str,(style & ALLOW_NEGATIVE) != 0)) { 
                ; 
            }else{ 
                return; // 不满足条件 
            } 
        }else if((style & QUOTE_FILTED) != 0) {  // 不允许引号 
            if(containQuotes(str)) { 
                return; 
            } 
        } 

        super.insertString(offs, str, a); 
    } 

    /** 
     * 判断长度限制条件是否满足 
     * @param length 总长度 
     * @return 是否满足 
     */ 
    private boolean isLengthPassed(int length) { 
        return ((limit == 0) || (length <= limit)); 
    } 

    /** 
     * 判断是否全是数字。 
     * @param oldStr 
     * @param offs 
     * @param str 
     * @param allowNegative 是否允许负值 
     * @return 是否满足 
     */ 
    private boolean isDigitalPassed(String oldStr, int offs, String str,
                                                    boolean allowNegative) { 
        if(allowNegative) { 
            String newStr = oldStr.substring(0, offs) + str + oldStr.
                                                             substring(offs); 
            return (newStr.equals("-") || (newStr.startsWith("-") && 
                                           allDigital(newStr.substring(1)))); 
        }else{ 
            return allDigital(str); 
        } 
    } 

    /** 
     * 判断是否全是数字。 
     * @param str 
     * @return 是否全是数字 
     */ 
    private boolean allDigital(String str) { 
        char[] chars = str.toCharArray(); 
        for(int i = 0, len = chars.length; i < len; i ++) { 
            if(chars[i] < '0' || chars[i] > '9') { 
                return false; 
            } 
        } 
        return true; 
    } 

    /** 
     * 判断指定的字符串中是否包含引号。 
     * @param str 需要判断的字符串 
     * @return 是否包含引号 
     */ 
    private boolean containQuotes(String str) { 
        char[] chars = str.toCharArray(); 
        for(int i = 0, len = chars.length; i < len; i ++) { 
            if(chars[i] == '\'' || chars[i] == '\"') { 
                return true; 
            } 
        } 
        return false; 
    } 
}


  


--

   幸亏我拼命的护住了脸!
    
         我猪一样的相貌才得以保全!!!

                                                                                         

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 211.93.58.23]
※ 修改:·DreamWeaver 於 03月26日09:33:03 修改本文·[FROM: 202.118.239.4]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:210.186毫秒