【问题标题】:Allow characters storage on JTextField only if are numbers仅当是数字时才允许在 JTextField 上存储字符
【发布时间】:2013-01-17 16:10:37
【问题描述】:
我想过滤在JTextField 上按下的键。
我希望只允许数字,如果按下其他字符,则将其删除或不允许在文本字段中存储。
我正在考虑使用addKeyListener,并使用方法:按下键和释放键。
有什么想法吗?
【问题讨论】:
-
-
“我希望只允许数字” 使用JSpinner 和SpinnerNumberModel,如this answer 所示。
标签:
java
swing
validation
jtextfield
keylistener
【解决方案1】:
使用自定义Document:
public class NumericDocument extends PlainDocument {
@Override
public void insertString(int pos, String text, AttributeSet as)
throws BadLocationException {
try {
Integer.parseInt(text);
super.insertString(pos, text, as);
} catch(NumberFormatException e) {
Toolkit.getDefaultToolkit().beep();
}
}
}
安装到你的TextField:
JtextField field = new JTextField();
field.setDocument(new NumericDocument());
即使粘贴了文本(没有触发KeyEvent),这也会起作用。
【解决方案2】:
没有冒犯,Ravindra 先生的答案是正确的,但是当您连续输入时它会失败..
我希望这会有所帮助:
final JTextField myTextFiled=new JTextField();
JFrame frame=new JFrame("onlyNums");
KeyListener myKeyListner=new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyChar()>='0' && e.getKeyChar()<='9')
myTextFiled.setText(myTextFiled.getText()+e.getKeyChar());
else if(e.getKeyChar()==KeyEvent.VK_BACK_SPACE && myTextFiled.getText().length()>0)
myTextFiled.setText(myTextFiled.getText().substring(0, myTextFiled.getText().length()-1));
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
};
//to null out handling other inputs
myTextFiled.setInputMap(JTextField.WHEN_FOCUSED, new InputMap());
//to add your own handling
myTextFiled.addKeyListener(myKeyListner);
注意:您必须添加处理以从指针位置插入/删除。
问候,
【解决方案3】:
试试这个
final JTextField myTextField = new JTextField();
myTextField.addKeyListener(new KeyListener() {
String oldText = "";
public void keyPressed(KeyEvent keyEvent) {
// Store old text in a temporary variable
oldText = myTextField.getText();
}
public void keyReleased(KeyEvent keyEvent) {
// Make sure that the user is typing a number else replace with old text.
int charCode = (int)keyEvent.getKeyChar();
if (charCode < 48 || charCode > 57){
myTextField.setText(oldText); // Replace with old text.
}
}
public void keyTyped(KeyEvent keyEvent) {
}
});