2012-10-12 8 views
5

Ich habe einen Code hier machen, dass ich MDP Weblog bilden bekam. der sizefilter und der Zahlfilter. Wie mache ich ein Textfeld seinen Filter für zwei Dokumentenfilter einstellen.Wie Textfeld haben 2 Dokumentenfilter

Hier ISTHE numberfilter

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 für die sizefilter ist

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(); 
} 
} 

Antwort

3

Sie zwei Möglichkeiten haben, soweit ich sehen kann. Erstellen Sie entweder ein zusammengesetztes Filter, das iteriert über jeden Filter:

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); 
     } 
    } 
} 

Sie würden vermutlich den Verbund mit dem restriktivere Filter instanziiert wollen zuerst, so würden Sie bauen es in etwa so:

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

Wenn die Reihenfolge von entscheidender Bedeutung ist, könnten Sie Ihre Filter als Dekoratoren 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(); 
     } 
    } 
} 
+2

Ich habe den ersten Code versucht und einige Fehler importiert. und es gibt diese einen Fehler an diesem Teil: 'filter.replace (fb, offs, Länge, a);' dies ist der Fehler: ** Methode in der Klasse ersetzt javax.swing.text.DocumentFilter kann nicht angewandt werden, zu den angegebenen Typen erforderlich: javax.swing.text.DocumentFilter.FilterBypass, int, int, java.lang.String, javax.swing.text.AttributeSet gefunden: javax.swing.text.DocumentFilter.FilterBypass, int, int, javax.print.attribute.AttributeSet ** –

+1

Sie haben das falsche AttributSet importiert. –

+1

jetzt, da ich die zwei Filter kombinierte, funktioniert es gerade nicht ich weiß nicht warum. aber es beschränkt irgendwie das Textfeld nur auf Zeichen und hinter dem Limit kann ich nur Zahlen eingeben –