文档filter在Java中不起作用?

在文本字段中超过10个字符na,它必须显示错误。 为此,我用过文档filter:

JTextField field = (JTextField) txtFld; AbstractDocument document = (AbstractDocument) field.getDocument(); document.setDocumentFilter(new DocumentSizeAndUppercaseFilter(10)); 

所以这是我的文档filter编码。 我通过文档filter注册了文本字段。 但这里什么也没发生。 如何使用文件filter?

具有错误消息的DocumentSizeAndUppercaseFilter类。

如果没有看到DocumentSizeAndUppercaseFilter的代码,我会怀疑你没有实现(/覆盖) DocumentFilterreplace方法:

 @Override public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { .... } 

以下代码的屏幕截图:

截图


DocumentSizeAndUppercaseFilter示例实现:

 static class DocumentSizeAndUppercaseFilter extends DocumentFilter { private final int max; public DocumentSizeAndUppercaseFilter(int max) { this.max = max; } @Override public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException { if (fb.getDocument().getLength() + text.length() < max) super.insertString(fb, offset, text.toUpperCase(), attr); else showError(); } @Override public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { int documentLength = fb.getDocument().getLength(); if (documentLength - length + text.length() < max) super.replace(fb, offset, length, text.toUpperCase(), attrs); else showError(); } private void showError() { JOptionPane.showMessageDialog(null, "Too many characters entered"); } } 

示例main

 public static void main(String[] args) { JTextField firstName = new JTextField(); AbstractDocument d = (AbstractDocument) firstName.getDocument(); d.setDocumentFilter(new DocumentSizeAndUppercaseFilter(10)); JFrame frame = new JFrame("Test"); frame.add(firstName); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 60); frame.setVisible(true); } 

从简单的事情开始。

Swing教程中关于实现文档filter的部分有一个工作示例,可以完成您想要的一半。