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

课程项目:Java Swing信用卡号码输入框仅显示后四位实现求助

Java Swing实现信用卡号码输入框(仅显示最后四位)

要实现输入信用卡号时仅显示最后四位、其余用X替代的效果,直接用密码框或普通文本框做不到,得通过DocumentFilter拦截输入并动态处理显示内容,同时保留真实卡号数据。下面是具体实现步骤:

核心实现:自定义DocumentFilter

这个过滤器会维护真实的信用卡号,每次输入/修改时,自动把前面的字符替换成X,只保留最后四位显示。

import javax.swing.text.*;

class CardNumberDocumentFilter extends DocumentFilter {
    private StringBuilder realCardNumber = new StringBuilder();
    private static final int MAX_LENGTH = 16; // 信用卡一般16位,可按需调整

    @Override
    public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
        // 只允许输入数字
        if (!string.matches("\\d+")) {
            return;
        }
        // 限制总长度
        if (realCardNumber.length() + string.length() > MAX_LENGTH) {
            return;
        }
        // 更新真实卡号
        realCardNumber.insert(offset, string);
        // 更新显示内容
        updateDisplay(fb);
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        if (!text.matches("\\d+")) {
            return;
        }
        // 替换时先删除对应长度的真实卡号内容
        realCardNumber.delete(offset, offset + length);
        // 插入新内容,同时限制长度
        int availableLength = MAX_LENGTH - realCardNumber.length();
        String insertText = text.substring(0, Math.min(text.length(), availableLength));
        realCardNumber.insert(offset, insertText);
        // 更新显示
        updateDisplay(fb);
    }

    @Override
    public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
        // 删除真实卡号对应内容
        realCardNumber.delete(offset, offset + length);
        // 更新显示
        updateDisplay(fb);
    }

    private void updateDisplay(FilterBypass fb) throws BadLocationException {
        String displayText;
        int len = realCardNumber.length();
        if (len <= 4) {
            displayText = realCardNumber.toString();
        } else {
            // 前面的字符用X填充,保留最后四位
            displayText = "X".repeat(len - 4) + realCardNumber.substring(len - 4);
        }
        // 替换整个文档内容为处理后的显示文本
        fb.getDocument().remove(0, fb.getDocument().getLength());
        fb.getDocument().insertString(0, displayText, null);
    }

    // 获取真实的信用卡号,结账时用这个
    public String getRealCardNumber() {
        return realCardNumber.toString();
    }
}

应用到JTextField

在你的结账界面中,创建文本框并绑定这个过滤器:

import javax.swing.*;
import java.awt.*;

public class CheckoutFrame extends JFrame {
    public CheckoutFrame() {
        setTitle("超市结账");
        setSize(400, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        JLabel cardLabel = new JLabel("信用卡/借记卡号码:");
        JTextField cardTextField = new JTextField(20);
        
        // 给文本框的Document设置自定义过滤器
        PlainDocument doc = (PlainDocument) cardTextField.getDocument();
        CardNumberDocumentFilter filter = new CardNumberDocumentFilter();
        doc.setDocumentFilter(filter);

        // 测试用的按钮,点击可获取真实卡号
        JButton submitBtn = new JButton("结账");
        submitBtn.addActionListener(e -> {
            String realCard = filter.getRealCardNumber();
            JOptionPane.showMessageDialog(this, "真实卡号:" + realCard);
        });

        add(cardLabel);
        add(cardTextField);
        add(submitBtn);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(CheckoutFrame::new);
    }
}

关键说明

  1. 真实卡号与显示分离:过滤器里的realCardNumber保存完整卡号,文本框显示的是替换后的内容,结账时直接调用getRealCardNumber()获取真实数据。
  2. 输入限制:只允许输入数字,并且限制总长度为16位(可根据需求调整MAX_LENGTH)。
  3. 动态更新显示:不管是输入、删除还是替换字符,都会实时更新显示内容,确保只露出最后四位。

内容的提问来源于stack exchange,提问作者cstjmn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:31:04