如何使用KeyEvent仅允许JTextField中的数字?

时间:2014-06-25 21:28:46

标签: java swing formatting textfield keyevent

我的尝试是:

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {                                       
        char c = evt.getKeyChar();

        if(c != '1' && c != '2' && c != '3' && c != '4' 
           && c != '5' && c != '6' && c != '7' && c != '8'
           && c != '9' && c != '0') {
            evt.consume(); 
        } 

这很奇怪,因为这是我的书给我看的。

此外,与格式化文本字段相比,这是否可行?

3 个答案:

答案 0 :(得分:3)

永远不要将KeyListener用于文本组件

首先,它没有考虑用户将文本粘贴到字段中时会发生什么。关键事件也可能被消费,永远不会到达你的听众

Swing有许多可能满足您需求的组件

这两个都能够限制用户输入数字,我是JSpinner,数字范围

这些字段是后期处理,也就是说,它们将允许用户输入他们想要的内容,但会在失去焦点或用户接受值时验证值

如果您想要实时过滤,请使用DocumentFilterexamples

答案 1 :(得分:2)

尝试将if (Mile of tests)替换为:

    if(c < '0' || c > '9')
        evt.consume();

或者,更具可读性,正如azurefrog所指出的那样:

    if(!Character.isDigit(c))
        evt.consume();

答案 2 :(得分:1)

如果你想让退格和删除按钮运行,那么你需要把它们放在你的if语句

<强>样品:

if(c != '1' && c != '2' && c != '3' && c != '4' 
               && c != '5' && c != '6' && c != '7' && c != '8'
               && c != '9' && c != '0') || !(c == KeyEvent.VK_BACK_SPACE) ||
               !(c == KeyEvent.VK_DELETE)){
                evt.consume(); 
            }