我希望我的文本字段只接受数字(数字)和一个点,因为它是一个用户可以写出产品价格的字段。我有这个代码,但它不能正常工作,它只接受数字并删除。
char c=evt.getKeyChar();
if(!(Character.isDigit(c))||(c==KeyEvent.VK_BACK_SPACE)||(c==KeyEvent.VK_DELETE)){
getToolkit().beep();
evt.consume();
}
有人可以帮我解决吗?
答案 0 :(得分:3)
我找到了解决此问题的方法: 这是我写的代码
char c=evt.getKeyChar();
if((Character.isDigit(c))||(c==KeyEvent.VK_PERIOD)||(c==KeyEvent.VK_BACK_SPACE)){
int punto=0;
if(c==KeyEvent.VK_PERIOD){
String s=pricefield.getText();
int dot=s.indexOf('.');
punto=dot;
if(dot!=-1){
getToolkit().beep();
evt.consume();
}
}
}
else{
getToolkit().beep();
evt.consume();
}
答案 1 :(得分:2)
不要使用KeyListener。这是使用AWT时的旧代码。
Swing拥有更新更好的API。
最简单的方法是使用JFormattedTextField
。阅读How to Use Formatted Text Fields上Swing教程中的部分,了解更多信息和工作示例。
另一种选择是使用DocumentFilter
。阅读Implementing a DocumentFilter上的Swing教程中的部分。
答案 2 :(得分:0)
private void textFieldKeyTyped(java.awt.event.KeyEvent evt){
获取keyTyped并将其传递给validate方法。
if(!validate(evt.getKeyChar())){
Char或keytyped不是有效的输入,因此请使用它。
evt.consume();
}
这限制了十进制的输入,只能输入一个小数点;
if(evt.getKeyChar()==KeyEvent.VK_DECIMAL || evt.getKeyChar()==KeyEvent.VK_PERIOD){
获取在textField中输入的整个字符串;
String field = textField.getText();
获取点的索引(。或十进制/句点)。 如果String没有任何点或小数点,indexOf()方法将返回-1。
int index = field.indexOf(".");
if(!(index==-1)){ //index is not equal to -1
evt.consume(); //consume
}
}
}
每次按键都会调用此方法。
private boolean validate(char ch){
确定字符是否具有与Integer,小数点,退格键或Delete匹配的值。如果char是整数,十进制,删除或退格键,则返回true,否则返回false。 但是,它不限制可以输入多少个小数点。
if(!(Character.isDigit(ch)
|| ch==KeyEvent.VK_BACKSPACE
|| ch==KeyEvent.VK_DELETE
|| ch==KeyEvent.VK_DECIMAL
|| ch==KeyEvent.VK_PERIOD)){
return false;
}
return true;
}
这是整个代码,我提供了一些注释,希望对您有所帮助。
private void textFieldKeyTyped(java.awt.event.KeyEvent evt) {
if(!validate(evt.getKeyChar())){ //get char or keytyped
evt.consume();
}
//limit one dot or decimal point can be entered
if(evt.getKeyChar()==KeyEvent.VK_DECIMAL || evt.getKeyChar()==KeyEvent.VK_PERIOD){
String field = textField.getText(); //get the string in textField
int index = field.indexOf("."); //find the index of dot(.) or decimal point
if(!(index==-1)){ //if there is any
evt.consume(); //consume the keytyped. this prevents the keytyped from appearing on the textfield;
}
}
}
//determine if keytyped is a valid input
private boolean validate(char ch){
if(!(Character.isDigit(ch)
|| ch==KeyEvent.VK_BACKSPACE
|| ch==KeyEvent.VK_DELETE
|| ch==KeyEvent.VK_DECIMAL
|| ch==KeyEvent.VK_PERIOD
)){
return false; //return false, because char is invalid
}
return true; // return true, when the if statement above does not meet its conditions
}