JTextField 只接受数字和一个点
JTextField accept only numbers and one dot
我希望我的文本字段只接受数字(数字)和一个点,因为用户可以在该字段中输入产品价格。我有这段代码,但效果不佳,它只接受数字并删除。
char c=evt.getKeyChar();
if(!(Character.isDigit(c))||(c==KeyEvent.VK_BACK_SPACE)||(c==KeyEvent.VK_DELETE)){
getToolkit().beep();
evt.consume();
}
有人可以帮我解决吗?
不要使用 KeyListener。那是使用 AWT 时的旧代码。
Swing 有更新更好的 API。
最简单的方法是使用 JFormattedTextField
。阅读有关 How to Use Formatted Text Fields 的 Swing 教程部分,了解更多信息和工作示例。
另一个选择是使用 DocumentFilter
。阅读 Swing 教程中关于 Implementing a DocumentFilter 的部分。
我找到了解决这个问题的方法:
这是我写的代码
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();
}
private void textFieldKeyTyped(java.awt.event.KeyEvent evt) {
Get the keyTyped and pass it to the method validate.
if(!validate(evt.getKeyChar())){
Char or keytyped is not a valid input, so let it consumed.
evt.consume();
}
this limit the input of Decimal, only ONE decimal point can be entered;
if(evt.getKeyChar()==KeyEvent.VK_DECIMAL || evt.getKeyChar()==KeyEvent.VK_PERIOD){
get the whole string entered in the textField;
String field = textField.getText();
get index of dot(. or decimal/period).
indexOf() method returns -1 if String does not have any dot or decimal poits.
int index = field.indexOf(".");
if(!(index==-1)){ //index is not equal to -1
evt.consume(); //consume
}
}
}
Every keypress, this method gets called.
private boolean validate(char ch){
this determine if the character has matching value to Integer, Decimal point, backspace or delete. It returns true if the char is a integer, decimal, delete or backspace, otherwise false.
However it does not limit how many decimal points can be entered.
if(!(Character.isDigit(ch)
|| ch==KeyEvent.VK_BACKSPACE
|| ch==KeyEvent.VK_DELETE
|| ch==KeyEvent.VK_DECIMAL
|| ch==KeyEvent.VK_PERIOD)){
return false;
}
return true;
}
here is the whole code, I have provided some comments, hope these will help.
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
}
Bellow 是我已经测试过并按预期工作的示例代码。
当用户输入或按错键时,我还添加了哔声。
private void textFieldScoreKeyTyped(java.awt.event.KeyEvent evt) {
char c = evt.getKeyChar();
if(c == KeyEvent.VK_BACK_SPACE){
evt.consume();
}else if(Character.isLetter(c) || String.valueOf(c).trim().isEmpty()){
getToolkit().beep();
evt.consume();
}else{
try{
Double.parseDouble(textFieldScore.getText()+c);
}catch(NumberFormatException e){
getToolkit().beep();
evt.consume();
}
}
}
祝大家好运!!
我希望我的文本字段只接受数字(数字)和一个点,因为用户可以在该字段中输入产品价格。我有这段代码,但效果不佳,它只接受数字并删除。
char c=evt.getKeyChar();
if(!(Character.isDigit(c))||(c==KeyEvent.VK_BACK_SPACE)||(c==KeyEvent.VK_DELETE)){
getToolkit().beep();
evt.consume();
}
有人可以帮我解决吗?
不要使用 KeyListener。那是使用 AWT 时的旧代码。
Swing 有更新更好的 API。
最简单的方法是使用 JFormattedTextField
。阅读有关 How to Use Formatted Text Fields 的 Swing 教程部分,了解更多信息和工作示例。
另一个选择是使用 DocumentFilter
。阅读 Swing 教程中关于 Implementing a DocumentFilter 的部分。
我找到了解决这个问题的方法: 这是我写的代码
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();
}
private void textFieldKeyTyped(java.awt.event.KeyEvent evt) {
Get the keyTyped and pass it to the method validate.
if(!validate(evt.getKeyChar())){
Char or keytyped is not a valid input, so let it consumed.
evt.consume();
}
this limit the input of Decimal, only ONE decimal point can be entered;
if(evt.getKeyChar()==KeyEvent.VK_DECIMAL || evt.getKeyChar()==KeyEvent.VK_PERIOD){
get the whole string entered in the textField;
String field = textField.getText();
get index of dot(. or decimal/period). indexOf() method returns -1 if String does not have any dot or decimal poits.
int index = field.indexOf(".");
if(!(index==-1)){ //index is not equal to -1
evt.consume(); //consume
}
}
}
Every keypress, this method gets called.
private boolean validate(char ch){
this determine if the character has matching value to Integer, Decimal point, backspace or delete. It returns true if the char is a integer, decimal, delete or backspace, otherwise false. However it does not limit how many decimal points can be entered.
if(!(Character.isDigit(ch)
|| ch==KeyEvent.VK_BACKSPACE
|| ch==KeyEvent.VK_DELETE
|| ch==KeyEvent.VK_DECIMAL
|| ch==KeyEvent.VK_PERIOD)){
return false;
}
return true;
}
here is the whole code, I have provided some comments, hope these will help.
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
}
Bellow 是我已经测试过并按预期工作的示例代码。 当用户输入或按错键时,我还添加了哔声。
private void textFieldScoreKeyTyped(java.awt.event.KeyEvent evt) {
char c = evt.getKeyChar();
if(c == KeyEvent.VK_BACK_SPACE){
evt.consume();
}else if(Character.isLetter(c) || String.valueOf(c).trim().isEmpty()){
getToolkit().beep();
evt.consume();
}else{
try{
Double.parseDouble(textFieldScore.getText()+c);
}catch(NumberFormatException e){
getToolkit().beep();
evt.consume();
}
}
}
祝大家好运!!