简单、可靠、便携的保证Java Swing控件只能输入数字的方法

今天写程序时又遇到了这个老大难问题:有个JTextField控件,只想让用户输入合法的数字,整数或者浮点数都行。每次遇到这个问题都要搜索半天,下次遇到还是不会。

网上能搜到的方法大概有这么几种种:

  1. 逐字验证法:响应KeyEvent事件,每个字符进来都验证是否在0-9之间(允许小数的话还要加小数点),如果在于其之内则放行,否则就把事件给consume()掉;有点事简单,但如果需要输入浮点数,有可以输入两个小数点的问题;
  2. 各种花式掩码法,包括正则表达式、FormattedTextField等方法,功能十分强(nan)大(xue);输入个数字而已,用这些办法总觉得太重了;
  3. 提交数据时验证Double.parseDouble()是否抛异常,如有问题弹窗并清空输入框法:除了容易气死用户之外,倒是不能说有有啥明显的缺点……

今天结合以上1、3方法,自创了一种方法,优点是可靠(绝不会有1.2344.2这类输入混进来),代码简单,不引入重量级代码:

jtCellScale.addKeyListener(new KeyAdapter() {
    @Override
    public void keyTyped(KeyEvent keyEvent) {
        char k = keyEvent.getKeyChar();
        String newString = SRMSimulatorWindow.this.jtCellScale.getText() + k;
        try {
            Double.parseDouble(newString);
            super.keyTyped(keyEvent);
        } catch (NumberFormatException e) {
            keyEvent.consume();
        }
    }
});

jtCellScaleJTextField的名字,SRMSimulatorWindow是外部类的名字。 此法思路在于:每次一个键输进来,首先实地验证新的字符串能否正确转换为需要的数字(Double.parseDouble(newString);,想要整数类型改这里就好);如果一切OK(没有抛异常)则允许字符上屏(super.keyTyped(keyEvent);),否则就把这个输入吃掉(keyEvent.consume();),就像用户没有按过这个键一样,这样用户侧感受也比较自然。

  • 最后更改: 2020/02/10 04:49