Frage Wie man textfield 2 Dokumentenfilter machen lässt


Ich habe hier einen Code, den ich aus dem Weblog von MDP habe. der sizefilter und der Zahlfilter. Wie mache ich ein Textfeld seinen Filter für zwei Dokumentenfilter einstellen.

Hier ist der Nummernfilter

import javax.swing.text.BadLocationException;
import javax.swing.text.AttributeSet;
import javax.swing.text.DocumentFilter;

public class IntFilter extends DocumentFilter {

public void insertString(DocumentFilter.FilterBypass fb, int offset,
                         String string, AttributeSet attr)
        throws BadLocationException {

    StringBuffer buffer = new StringBuffer(string);
    for (int i = buffer.length() - 1; i >= 0; i--) {
        char ch = buffer.charAt(i);
        if (!Character.isDigit(ch)) {
            buffer.deleteCharAt(i);
        }
    }
    super.insertString(fb, offset, buffer.toString(), attr);
}

public void replace(DocumentFilter.FilterBypass fb,
                    int offset, int length, String string, AttributeSet attr) throws BadLocationException {
    if (length > 0) fb.remove(offset, length);
    insertString(fb, offset, string, attr);
}
}

Dieser Code ist für den Größenfilter

import java.awt.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class SizeFilter extends DocumentFilter {

private int maxCharacters;    

public SizeFilter(int maxChars) {
    maxCharacters = maxChars;
}

public void insertString(FilterBypass fb, int offs, String str, AttributeSet a)
        throws BadLocationException {

    if ((fb.getDocument().getLength() + str.length()) <= maxCharacters)
        super.insertString(fb, offs, str, a);
    else
        Toolkit.getDefaultToolkit().beep();
}

public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
        throws BadLocationException {

    if ((fb.getDocument().getLength() + str.length()
            - length) <= maxCharacters)
        super.replace(fb, offs, length, str, a);
    else
        Toolkit.getDefaultToolkit().beep();
}
}

5
2017-10-12 13:24


Ursprung


Antworten:


Soweit ich sehen kann, haben Sie zwei Möglichkeiten. Erstellen Sie entweder einen zusammengesetzten Filter, der über jeden Filter iteriert:

public class CompositeFilter extends DocumentFilter {
    private final DocumentFilter[] filters;

    public CompositeFilter(DocumentFilter... filters) {
        this.filters = filters;
    }

    public void insertString(FilterBypass fb, int offs, String str, AttributeSet a)
        throws BadLocationException {
        for (DocumentFilter filter : filters) {
            filter.insertString(fb, offs, str, a);
        }
    }

    public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
        throws BadLocationException {
        for (DocumentFilter filter : filters) {
            filter.replace(fb, offs, length, a);
        }
    }
}

Wahrscheinlich möchten Sie zuerst das Composite mit dem restriktiveren Filter instanziieren, also würden Sie es wie folgt konstruieren:

new CompositeFilter(new SizeFilter(10), new IntFilter());

Wenn die Reihenfolge von entscheidender Bedeutung ist, könnten Sie Ihre Filter als Dekorierer neu schreiben, z. Übergeben Sie den zweiten Filter in den ersten und rufen Sie ihn dann auf.

public class SizeFilter extends DocumentFilter {
    private int maxCharacters;    
    private final DocumentFilter delegate;

    public SizeFilter(int maxChars, DocumentFilter delegate) {
        maxCharacters = maxChars;
        this.delegate = delegate;
    }

    public void insertString(FilterBypass fb, int offs, String str, AttributeSet a)
        throws BadLocationException {

        if ((fb.getDocument().getLength() + str.length()) <= maxCharacters)
            delegate.insertString(fb, offs, str, a);
        else
            Toolkit.getDefaultToolkit().beep();
    }

    public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
        throws BadLocationException {

        if ((fb.getDocument().getLength() + str.length() - length) <= maxCharacters)
            delegate.replace(fb, offs, length, str, a);
        else
            Toolkit.getDefaultToolkit().beep();
        }
    }
}

3
2017-10-12 13:34