首先继承一个PlainDocument,如下,重载insertString方法。
//说明如何限制只允许录入整数
class IntegerDocument extends PlainDocument{
 public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
 try{
        Integer.parseInt(s);
}catch(Exception e) {
Toolkit.getDefaultToolkit.beep();
return;
}
super.insertString(offs,s,a);
}
然后将这个类作为你的文本组件的数据模型,
JTextField tf = new JTextField();
tf.setDocument(new IntegerDocument);
如此这个tf就只允许录入数值了。来源:java2图形设计  page883

解决方案 »

  1.   

    捕捉键盘事件,判断输入字符的ASCII值,如果是
    30~39,则为半角的数字。
      

  2.   

    To :FutureStonesoft(丑石)
       在ASCII中 数字的ASCII值为48—57。
      

  3.   

    呵呵,楼主啊,我列出的数字对应的ASCII码是16进制的。
    30h~39h《==》48d~57d,不过我原先理解错了你的意思。全角的数字其实也是字符,这勿庸置疑,只要能确定它们对应
    的二进制数值,那么问题也就迎刃而解了。
    全角的数字字符占两个字节,第一个字节必为-93d,第二个字节
    必定在-80d~-71d之间(分别对应0~9),了解了这个,就
    可以编出来了,方法综合用到了simonhappy() 和louisqiang(tenwin)
    提到的方法。下面是源代码,你编译运行试试,应该没有任何问题。//Runfrmae.java
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.text.*;class FilterDocument extends PlainDocument
    {
    byte[] bs=new byte[3];
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException 
    {
      bs=str.getBytes();
    if(bs.length==2 && bs[0]==-93)//如果是中文字符并且第一个字节为-93
    {
    if(bs[1]>=-80 && bs[1]<=-71)
    {
    //如果第二个字节在-80~-71之间,那么刚刚输入的字符为全角的数字字符
    //则忽略刚刚输入的字符
    Toolkit.getDefaultToolkit().beep();
    return;
    }

    super.insertString(offs,str,a);//否则就插入刚刚输入的字符
    }
    }
    class TFrame extends JFrame
    {
    TFrame()
    {
    setTitle("测试--限制输入全角的数字");
    setBounds(200,200,400,300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTextArea tf=new JTextArea();
    tf.setDocument(new FilterDocument());
    Container contentPane=getContentPane();
    contentPane.add(tf);
    }
    }
    public class Runframe
    {
    public static void main(String[] args)
    {
    int a=0;
    TFrame frm=new TFrame();
    frm.setVisible(true);
    }
    }