【问题标题】:KeyTyped events - Why can I enter a character but when I delete I cannot enter anymore?KeyTyped 事件 - 为什么我可以输入一个字符,但当我删除时我不能再输入?
【发布时间】:2015-11-26 07:19:49
【问题描述】:

我用这个代码限制只能输入数字,但是如果我按的第一个键是一个字母,这个代码让我输入那个字母,只能输入一次,然后当我删除它时,我不能再输入字母了,什么代码有问题吗?我只想输入数字。

amount.addKeyListener(new KeyAdapter() {
        public void keyTyped(KeyEvent e) {
            char c = e.getKeyChar();
            if (!(Character.isDigit(c)
                    || (c == KeyEvent.VK_BACK_SPACE)
                    || (c == KeyEvent.VK_DELETE))
                    || (amount.getText().length() >= 2)) {
                e.consume();
            }
        }
    }); 

【问题讨论】:

  • 请考虑使用 DocumentListener(在文本字段的 Document 上)或使用 SpinnerNumberModelJSpinner

标签: java swing


【解决方案1】:

因为De Morgan's laws

"not (A or B)" 与 "(not A) and (not B)" 相同。

你的条件相当于:

if ((Character.isDigit(c) 
    && c == KeyEvent.VK_BACK_SPACE
    && c == KeyEvent.VK_DELETE)) 
    || cantBannosTxt.getText().length() >= 2)

当您输入两个字母时,OR 的第一部分失败,但第二部分的计算结果为 true。由于false || truetrue,它消耗您输入的内容。

我将把它留给您构建一个新的验证 - 注意逻辑 &&||! 结合时。

【讨论】:

  • 我不明白,为什么 AND 和 OR 相关。因为如果我删除该部分仍然会得到相同的结果 if (!(Character.isDigit(c))) { e.consume(); }
  • OP 正在检查!(isDigit || isBackSpace || isDelete) || len >= 2 是否等同于(isNotDigit && isNotBackSpace && isNotDelete) || len >= 2。也许你错过了最后一次编辑。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2015-12-29
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 2012-02-01
相关资源
最近更新 更多