2012-10-12 4 views
5

私はここにMDPのウェブログ形式のコードがあります。サイズフィルタと数値フィルタ。どのように私はテキストフィールドを2つのドキュメントフィルタ用にそのフィルタを設定するのですか?テキストフィールドには2つのドキュメントフィルタがあります

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

このコードは、あなたが私の知る限り見ることができるように2つのオプションを持っているsizefilter

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

答えて

3

ためです。どちらの複合フィルタを作成した各フィルタを反復:

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

あなたはおそらく最初より制限フィルタと複合体をインスタンス化したいと思いますので、あなたがそうのようにそれを構築したい:

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

注文が非常に重要な場合は、フィルタをデコレータとして書き直すことを検討してください。 2番目のフィルタを最初のフィルタに渡してから呼び出します。

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

私は最初のコードを試していくつかのエラーのインポートを修正しました。 'filter.replace(fb、offs、length、a);' これはエラーです: **クラスjavax.swing.text.DocumentFilterのメソッド置き換えは適用できません指定された型に が必要:javax.swing.text.DocumentFilter.FilterBypass、int、int、java.lang.String、javax.swing.text.AttributeSet が見つかりました:javax.swing.text.DocumentFilter.FilterBypass、int、int、 javax.print.attribute.AttributeSet ** –

+1

間違ったAttributeSetをインポートしました。 –

+1

今は2つのフィルタを組み合わせて、うまく動作しません。理由はわかりません。それはどういうわけか文字列に限ってテキストフィールドを制限し、制限を超えてしまいます。数字だけを入力できます –

関連する問題