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