课程项目: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); } }
关键说明
- 真实卡号与显示分离:过滤器里的
realCardNumber保存完整卡号,文本框显示的是替换后的内容,结账时直接调用getRealCardNumber()获取真实数据。 - 输入限制:只允许输入数字,并且限制总长度为16位(可根据需求调整
MAX_LENGTH)。 - 动态更新显示:不管是输入、删除还是替换字符,都会实时更新显示内容,确保只露出最后四位。
内容的提问来源于stack exchange,提问作者cstjmn
相关产品推荐
相关产品推荐

