自定义JTextField处理减号按键时存在异常问题
问题分析与修复方案
问题根源
你的代码里确实存在一个小bug:在processKeyEvent方法中,不管if条件是否成立,最后都会执行ev.consume()。哪怕减号按键触发了if里的super.processKeyEvent(ev),让Swing处理了输入事件,但紧接着的ev.consume()会把这个事件彻底消耗掉,导致减号无法被插入到文本框中。
修复代码
只需要把ev.consume()放到else分支里,只有当输入的字符不允许时才消耗事件:
import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; public class JNumberField extends JTextField { public JNumberField(int width, int height) { this(); setPreferredSize(new Dimension(width, height)); } public JNumberField() { setFont(new Font("Monospace", Font.BOLD, 23)); setHorizontalAlignment(JTextField.HORIZONTAL); } @Override public void processKeyEvent(KeyEvent ev) { //接受数字、退格、减号及左右方向键 if (Character.isDigit(ev.getKeyChar()) || ev.getKeyCode() == KeyEvent.VK_BACK_SPACE || ev.getKeyCode() == KeyEvent.VK_MINUS || ev.getKeyCode() == KeyEvent.VK_LEFT || ev.getKeyCode() == KeyEvent.VK_RIGHT) { super.processKeyEvent(ev); } else { // 只有不允许的输入才消耗事件 ev.consume(); } } public static void main(String[] args) { JOptionPane.showInputDialog(new JNumberField(300,50)); } }
额外优化建议(可选)
目前的逻辑允许输入多个减号(比如--123),如果要限制只能输入一个减号且只能在开头,可以在if条件里补充判断:
// 在允许减号的条件中新增限制 ev.getKeyCode() == KeyEvent.VK_MINUS && (getText().isEmpty() || getText().charAt(0) != '-')
这样就能避免出现多个减号的非法输入啦。
内容的提问来源于stack exchange,提问作者Teh Swish
相关产品推荐
相关产品推荐

