فیلترسازی با استفاده از کلاس DocumentFilter

در مجموعه کنترلهای AWT ، اگر شما نیاز داشتید که ورود متن را در کامپوننتهای متنی محدود به کاراکتر خاصی نمائید، مانند اینکه در TextField فقط اعداد وارد شود و یا فقط حروف الفبا وارد شود و یا اینکه اعداد وارد شده در محدوده خاصی باشند، باید رویدادهای KeyListener و consume را به کامپوننت متنی مانند TextField اضافه می کردید. اما در مجموعه کنترلهای Swing شما می توانید این کار را با استفاده از اینترفیس Document انجام داده و یا یک کلاس DocumentFilter را به کامپوننت متنی اضافه کرده و کنترل اطلاعات  را بوسیله آن انجام دهید. برای انجام این کار باید از متد setDocumentFilter از کلاس AbstractDocument استفاده کنید .  کلاس DocumentFilter دارای 3 نوع متد است که می توانید بوسیله آنها ورود متن در کامپوننتهای متنی مانند JTextField را کنترل کنید. با توجه به اینکه این کلاس یک کلاس اصلی است برای ایجاد فیلتر باید یک کلاس فرعی ایجاد کرده که extends کلاس DocumentFilter باشد . متدهایی که می توان در کلاس DocumentFilter مورد استفاده قرار داد به صورت زیر میباشند.

  • public void insertString(DocumentFilter.FilterBypass fb , int offset , String text , AttributeSet at) ;

از متد فوق می توانید در زمان وارد کردن متن در JTextField و یا هر کامپوننت متنی استفاده کنید.

  • public void remove(DocumentFilter.FilterByPass fb , int offset , int length ) ;

از متد فوق در زمان پاک کردن قسمتنی از متن می توانید استفاده کنید.

  • public void replace(DocumentFilter.FilterByPass fb , int offset , int length, string text , AttributeSet at);

این متد در زمان اینکه متنی جدید جایگزین متنی انتخاب شده و یا highlight شده باشد.

نحوه استفاده از DocumentFilter و متدهای فوق به این صورت است که ابتدا باید یک کلاس جدید که با استفاده از کلاس پایه DocumentFilter پیاده سازی شده باشد، را تعریف کنید. سپس در کلاس مذکور متد های فوق بصورت Override نوشته و کدهای مورد نظر خود را برای فیلتر در داخل متدها قرار دهید ، در پایان با استفاده از کلمه super متد ایجاد شده را بر روی متد اصلی Override کنید. برای آشنایی بیشتر با این متدها به مثالهای زیر توجه کنید.

وارد کردن حروف بزرگ در JTextField

برای این کار همانطور که گفته شد باید یک کلاس جاوا با استفاده از پیاده ساز DocumentFilter ایجاد کرده و متدهای فوق را بصورت Override در درون این کلاس قرار دهیم. در این مثال کلاس UpperCaseDocumentFilter را بصورت زیر ایجاد کرده ایم . روش ایجاد متدها به این صورت است که اول پارامتر String ورودی را کنترل می کنیم که برابر با مقدار null نباشد و سپس متد و یا عملیات مورد نظر را روی رشته ورودی اجرا می کنیم. در این مثال پس از کنترل رشته ورودی با استفاده از متد toUpperCase، متن ورودی را به حروف بزرگ تبدیل می کنیم. کد این کلاس بصورت زیر است.

package documentfilter;

 

import javax.swing.text.BadLocationException;

import javax.swing.text.DocumentFilter;

 

/**

 *

 * @author Mehdi Ghermezkon

 */

public class UpperCaseDocumentFilter extends DocumentFilter {

   

    /** Creates a new instance of UpperCaseDocumentFilter */

    public UpperCaseDocumentFilter() {

    }

    public void insertString(DocumentFilter.FilterBypass fb , int offset ,

            String string , javax.swing.text.AttributeSet attr) throws BadLocationException {

        String newValue = "";

        if(string != null){

            newValue = string.toUpperCase();

        }

        super.insertString(fb , offset , newValue , attr);

    }

 

    public void replace(DocumentFilter.FilterBypass fb , int offset ,

            int length , String text , javax.swing.text.AttributeSet attrs) throws BadLocationException{

        String newValue = "";

        if(text != null){

            newValue = text.toUpperCase();

        }

        super.replace(fb , offset , length , newValue , attrs);

    }

}

نکته: اگر میخواهید تمام کارکتر های ورودی به صورت حروف کوچک نوشته شوند، میتوانید از متد toLowerCase در دستورات فوق استفاده نمائید.