简单、可靠、便携的保证Java Swing控件只能输入数字的方法
今天写程序时又遇到了这个老大难问题:有个JTextField
控件,只想让用户输入合法的数字,整数或者浮点数都行。每次遇到这个问题都要搜索半天,下次遇到还是不会。
网上能搜到的方法大概有这么几种种:
- 逐字验证法:响应KeyEvent事件,每个字符进来都验证是否在
0-9
之间(允许小数的话还要加小数点),如果在于其之内则放行,否则就把事件给consume()
掉;有点事简单,但如果需要输入浮点数,有可以输入两个小数点的问题; - 各种花式掩码法,包括正则表达式、
FormattedTextField
等方法,功能十分强(nan)大(xue);输入个数字而已,用这些办法总觉得太重了; - 提交数据时验证
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();
),就像用户没有按过这个键一样,这样用户侧感受也比较自然。