黑马程序员技术交流社区
标题:
关于GUI的小问题
[打印本页]
作者:
许涛
时间:
2012-5-19 05:19
标题:
关于GUI的小问题
本帖最后由 许涛 于 2012-5-19 05:21 编辑
这是一段文本框键盘监听代码,需求是:限定文本框中只能输入0~9数字,限制数字之外的非法字符的输入,以下代码虽然能限制字母的输入,但是 !@#$ 等字符依旧能进入文本框(也就是shift+1,2,3...),原因是什么呢?求代码改进,谢谢
TextField tf = new TextField(20);
public void myEvent(){
tf.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(!(e.getKeyCode()>=KeyEvent.VK_0 && e.getKeyCode()<=KeyEvent.VK_9))
e.consume();
}
});
}
复制代码
作者:
梁小波
时间:
2012-5-19 08:59
个人认为应该在接受键值时他是判断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-19 09:17
因为要输入数字与输入你所说的特殊字符时按的键是同一个键,只不过输入特殊字符时要按下shift键,你可以在if语句上加一句System.out.println(e.getkeyCode());这样你就会看到你所按的键的值,但你输入1时所按的键值是49,输入!时所按的键值为16 49,符合if条件,所以能输进去,另外,在输入时必须是英文输入法才行,若是中文输入法,则能输入汉字而且不会显示键值。
作者:
黑马罗坚
时间:
2012-5-19 14:23
用输入法输入数字字母也是检测不到滴哦。。
作者:
刘蕴学
时间:
2012-5-19 14:30
本帖最后由 刘蕴学 于 2012-5-19 15:20 编辑
总算来个有意思的帖子了
这个是你要的
public void keyPressed(KeyEvent e)
{
e.consume();
if ((e.getModifiers() == 0) && (e.getKeyCode() >= KeyEvent.VK_0 && e.getKeyCode() <= KeyEvent.VK_9))
{
}
}
复制代码
这个是另外一种办法
public class Document extends javax.swing.text.PlainDocument
{
public static void main(String[] args)
{
JTextField jTextField = new JTextField();
Document document = new Document();
//[a-zA-Z0-9\u4e00-\u9fa5]
//简单的正则表达式,这你不用管,0-9是限制只有数字
//a-z是小写字母,\\u那个是中文
document.setCharLimit("[0-9]");
jTextField.setDocument(document);
//这样就限制能输入数字了
}
private static final long serialVersionUID = -4462693078138709956L;
private String limit = ""; // 输入字符限制的正则表达式
private int maxLength = -1; // 输入字符最大长度的限制,-1为不限制
private double maxValue = 0; // 如果输入的是数字,则最大值限制
private boolean isMaxValue = false; // 是否采用了最大值限制
private java.awt.Toolkit toolkit = null; // 用来在错误的时候发出系统声音
private boolean beep = false; // 是否发声,true为发出声音
// 构造方法
public Document()
{
super();
this.init();
}
public Document(Content c)
{
super(c);
this.init();
}
/**
* 所有构造都需要的公共方法
*/
private void init()
{
toolkit = java.awt.Toolkit.getDefaultToolkit();
}
// 构造方法结束
/**
* 设置字符限制条件[a-zA-Z0-9\u4e00-\u9fa5]
*
* @param limit
* 限制条件 参考正则表达式 java.util.regex.Pattern
*/
public void setCharLimit(String limit)
{
this.limit = limit;
}
/**
* 返回字符限制的条件
*
* @return 条件
*/
public String getCharLimit()
{
return this.limit;
}
/**
* 清除所有限制字符
*/
public void clearLimit()
{
this.limit = null;
}
/**
* 字符输入限制是否包含该字符
*
* @param input
* 字符
* @return true为包含,false为不包含
*/
public boolean isOfLimit(CharSequence input)
{
if (limit == null)
{
return true;
}
else
{
return java.util.regex.Pattern.compile(limit).matcher(input).find();
}
}
/**
* 字符输入的限制组是否为空
*
* @return true为空,false为有
*/
public boolean isEmptyLimit()
{
if (limit == null)
{
return true;
}
else
{
return false;
}
}
/**
* 设置文本框所允许输入的最大字符长度
*
* @param maxLength
* 最大字符长度
*/
public void setMaxLength(int maxLength)
{
this.maxLength = maxLength;
}
/**
* 取消文本框最大字符长度的限制
*/
public void cancelMaxLength()
{
this.maxLength = -1;
}
/**
* 如果输入的为纯数字,则可用此方法来设置数字的最大值
*
* @param maxValue
* 最大值
*/
public void setMaxValue(double maxValue)
{
this.isMaxValue = true;
this.maxValue = maxValue;
}
/**
* 文本框是否限制了数字内容的最大数值
*
* @return true为限制了
*/
public boolean isMaxValue()
{
return this.isMaxValue;
}
/**
* 返回限制数字内容最大值
*
* @return double类最大值,如果没有限制会返回0
*/
public double getMaxValue()
{
return this.maxValue;
}
/**
* 取消数字内容的最大值设置
*/
public void cancelMaxValue()
{
this.isMaxValue = false;
this.maxValue = 0;
}
/**
* 使所有限制设置恢复默认
*/
public void reset()
{
clearLimit();
cancelMaxLength();
cancelMaxValue();
}
/**
* 错误时发声开关
*
* @param beep
* true为发声音
*/
public void errorBeep(boolean beep)
{
this.beep = beep;
}
/**
* 输入错误时是否发声
*
* @return boolean true为发声
*/
public boolean isErrorBeep()
{
return beep;
}
public void insertString(int offs, String str, javax.swing.text.AttributeSet a) throws javax.swing.text.BadLocationException, NumberFormatException
{
// 若字符串为空,直接返回。
if (str == null)
{
return;
}
boolean b = true;
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++)
{
String temp = String.valueOf(ch[i]);
// 如果要输入的字符不在允许范围内
if (!isOfLimit(temp))
{
b = false;
}
// 如果有字符长度限制,并且现在的字符长度已经大于或等于限制
if (maxLength > -1 && this.getLength() >= maxLength)
{
b = false;
}
}
// 如果内容设置了最大数字
if (isMaxValue)
{
String s = this.getText(0, this.getLength()); // 文档中已有的字符
s = s.substring(0, offs) + str + s.substring(offs, s.length());
if (Double.parseDouble(s) > maxValue)
{
if (beep)
{
toolkit.beep(); // 发出声音
}
return;
}
}
// 如果输入不合法
if(!b)
{
if (beep)
{
toolkit.beep(); // 发出声音
}
return;
}
super.insertString(offs, new String(ch), a);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2