You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:02:39