【问题标题】:How do I only allow numbers in a JTextField using a KeyEvent?如何使用 KeyEvent 只允许 JTextField 中的数字?
【发布时间】:2014-06-25 21:28:46
【问题描述】:

我的尝试是:

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

这很奇怪,因为这是我的书向我展示的。

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

【问题讨论】:

  • 上述代码的当前结果是什么?是字吗?
  • 好吧,即使这个问题已经解决了,除了不允许退格和删除按钮起作用之外,它什么也做不了。
  • 不要使用 keyEvents,它们太低级且不安全,无法验证(我无法处理粘贴的代码)。相反,使用 DocumentFilter 或 JFormattedTextField

标签: java swing formatting textfield keyevent


【解决方案1】:

你不应该在文本组件中使用KeyListeners

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

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

这两者都能够将用户输入限制为数字,我就是 JSpinner 的情况,数字范围

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

如果你想要实时过滤,你应该使用DocumentFilter,对于examples

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我有点困惑为什么这解决了我的问题;你能解释一下吗?
    • @Eypros 不。如果我们这样做,那么 0 和 9 将被消耗而不是执行。
    • @user3758041 chars 被美化(且未签名)shorts。您可以像使用任何其他原始数字类型一样对它们进行加法、除法、取模等。这包括将它们与运营商进行比较。如果您想要完整的字符列表,here 就是一个。
    • 只使用Character.isDigit(c) 而不是手动检查可能更具可读性。
    • 试图在一个 if 语句中明确地进行 10 次测试,你一定会犯错误/错字。越短通常越好。通过像这样清理它,您可以使代码无限地更具可读性,并且在这种情况下更快。
    【解决方案3】:

    如果你想让退格和删除按钮起作用,那么你需要把它们放在你的 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(); 
                } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 2012-02-02
      • 2011-08-05
      • 2012-08-04
      • 2013-12-30
      • 1970-01-01
      • 2013-08-08
      相关资源
      最近更新 更多