Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Document filter is not working in Java?

In text field more than 10 characters na, it has to show an error. For that i used document filter:

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

So this is my document filter coding. I registered the textfield through document filter. But nothing has happening here. How to use document filter?

DocumentSizeAndUppercaseFilter class which has the error msg.

like image 928
shree Avatar asked Sep 23 '11 10:09

shree


2 Answers

Without seeing the code for DocumentSizeAndUppercaseFilter I would suspect that you havn't implemented (/override) the DocumentFilter's replace method:

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

    ....
}

Screenshot from the code below:

screenshot


Example implementation of 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");
    }
}

Example 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);
}
like image 194
dacwe Avatar answered Nov 03 '22 02:11

dacwe


Start with something simple.

The section from the Swing tutorial on Implementing a Document Filter has a working example that does half of what you want.

like image 1
camickr Avatar answered Nov 03 '22 04:11

camickr