2012-10-12 13 views
5

मेरे पास एक कोड है कि मुझे एमडीपी का वेबलॉग मिला है। sizefilter और संख्या फ़िल्टर। मैं एक टेक्स्टफील्ड को दो दस्तावेज़ फ़िल्टर के लिए अपना फ़िल्टर कैसे सेट करूं?टेक्स्टफील्ड को कैसे बनाएं 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); 
} 
} 

इस कोड 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()); 

यदि आदेश गंभीर रूप से महत्वपूर्ण है, तो आप अपने फ़िल्टर को सजावटी के रूप में पुनः लिखने पर विचार कर सकते हैं, उदाहरण के लिए पहले फ़िल्टर को पहले में पास करें और फिर इसे कॉल करें।

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 में विधि को प्रतिस्थापित करें। दस्तावेज़फिल्टर लागू नहीं किया जा सकता दिए गए प्रकार आवश्यक: 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

आपने गलत विशेषता एसईटी आयात की है। –

+1

अब मैंने दो फ़िल्टरों को जोड़ दिया है, यह सिर्फ सही काम नहीं करता है, मुझे क्यों पता नहीं है। लेकिन यह किसी भी तरह से टेक्स्टफील्ड को केवल वर्णों तक सीमित करता है और सीमा से पहले मैं केवल संख्या टाइप कर सकता हूं –

संबंधित मुद्दे