Java 仅当是数字时才允许在JTextField上存储字符

Java 仅当是数字时才允许在JTextField上存储字符,java,swing,validation,jtextfield,keylistener,Java,Swing,Validation,Jtextfield,Keylistener,我想过滤在JTextField上按下的键。 我希望只允许数字,如果按下其他字符,则将其删除或不允许在文本字段中存储 我正在考虑使用一个addKeyListener,并使用以下方法:按键按下和按键释放 有什么想法吗?试试这个 final JTextField myTextField = new JTextField(); myTextField.addKeyListener(new KeyListener() { String oldText = ""; public vo

我想过滤在
JTextField
上按下的键。 我希望只允许数字,如果按下其他字符,则将其删除或不允许在文本字段中存储

我正在考虑使用一个
addKeyListener
,并使用以下方法:按键按下和按键释放

有什么想法吗?

试试这个

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) {
      }
    });
final JTextField myTextField=new JTextField();
myTextField.addKeyListener(新的KeyListener(){
字符串oldText=“”;
按下公共无效键(KeyEvent KeyEvent){
//将旧文本存储在临时变量中
oldText=myTextField.getText();
}
公共无效密钥已释放(KeyEvent KeyEvent){
//确保用户正在键入数字,否则将替换为旧文本。
int charCode=(int)keyEvent.getKeyChar();
如果(字符码<48 | |字符码>57){
myTextField.setText(oldText);//替换为旧文本。
}
}
public void keyTyped(KeyEvent KeyEvent){
}
});

恕我冒犯,拉文德拉先生的答案是正确的,但如果你连续打字,答案就会失败。。 我希望这有助于:

    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);
final JTextField mytextfield=new JTextField();
JFrame=新JFrame(“onlyNums”);
KeyListener myKeyListner=新的KeyListener(){
@凌驾
public void keyTyped(KeyEvent e){
//TODO自动生成的方法存根
if(e.getKeyChar()>='0'&&e.getKeyChar()0)
mytextfield.setText(mytextfield.getText().substring(0,mytextfield.getText().length()-1));
}
@凌驾
公共无效密钥已释放(密钥事件e){
//TODO自动生成的方法存根
}
@凌驾
按下公共无效键(按键事件e){
//TODO自动生成的方法存根
}
};
//在处理其他输入时取消输入
mytextfield.setInputMap(JTextField.WHEN_FOCUSED,new InputMap());
//添加您自己的处理
mytextfield.addKeyListener(myKeyListner);
注意:您必须添加处理以插入/删除指针位置。


关于,

使用自定义的
文档

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();
        }
    }

}
安装到您的
文本字段

JtextField field = new JTextField();
field.setDocument(new NumericDocument());
即使粘贴了文本(没有触发
KeyEvent
),这也会起作用。

可能的重复:“我希望只允许数字”使用
JSpinner
SpinnerNumberModel
,如中所示。如果执行复制粘贴怎么办?如果执行复制粘贴怎么办?