وارد کردن فقط عدد در JTextField

روش انجام کار دقیقا مانند مثالهای گفته شده در قسمتهای قبل میباشد، در این مثال از کلاس IntegerDocumentFilter که با استفاده از کلاس DocumentFilter پیاده سازی شده است ، استفاده خواهیم کرد. همچنین با استفاده از متد Integer.parseInt رشته ورودی را کنترل کرده و اگر از نوع عددی نباشد یک استثناء از نوع BadLocationException ایجاد خواهد شد و در غیر اینصورت همان رشته ورودی مورد قبول خواهد بود .

package documentfilter;

 import javax.swing.text.BadLocationException;

import javax.swing.text.DocumentFilter;

 

/**

 *

 * @author Mehdi Ghermezkon

 */

public class IntegerOnlyDocumentFilter extends DocumentFilter {

   

    /** Creates a new instance of IntegerOnlyDocumentFilter */

    public IntegerOnlyDocumentFilter() {

    }

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

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

        try{

            Integer.parseInt(string);

        }catch(NumberFormatException e){

            throw new BadLocationException(string , offset);           

        }

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

    }

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

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

        try{

            Integer.parseInt(text);

        }catch(NumberFormatException e){

            throw new BadLocationException(text , offset);

        }

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

    }

}

وارد کردن عدد علامت در JTextField

برای این کار ابتدا کلاسی بنام SignIntegerOnlyDocumentFilter که با استفاده از کلاس DocumentFilter پیاده سازی شده است ، ایجاد می کنیم. سپس یک رشته ثابت حاوی اعداد(0123456789) تعریف کرده و در متدهای insertString و replace آنرا به یک رشته دیگر نسبت می دهیم و در آخر با یک حلقه for رشته ایجاد شده جدید را که حاوی اعداد هستند با رشته JTextField مقایسه می کنیم. اگر رشته ورودی مطابق با رشته ثابت نباشد ، در JTextField هیچ مقدار قرار داده نمیشود.

package documentfilter;

 import javax.swing.text.BadLocationException;

import javax.swing.text.DocumentFilter;

 

/**

 *

 * @author Mehdi Ghermezkon

 */

public class SignIntegerOnlyDocumentFilter extends DocumentFilter {

   

    /** Creates a new instance of SignIntegerOnlyDocumentFilter */

    public final String NUMERIC = "0123456789";

    public SignIntegerOnlyDocumentFilter() {

    }

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

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

        String acceptString = NUMERIC ;

        acceptString += "-";

        for (int i=0; i < string.length(); i++) {

            if (acceptString.indexOf(string.valueOf(string.charAt(i))) == -1)

                return;

        }

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

    }

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

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

        String acceptString = NUMERIC ;

        acceptString += "-";

        for (int i=0; i < text.length(); i++) {

            if (acceptString.indexOf(text.valueOf(text.charAt(i))) == -1)

                return;

        }   

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

    }

}

   

وارد کردن اعداد اعشاری در JTextField

کلاسی که در این قسمت مورد استفاده قرار می گیرد ، کلاس FloatNumberDocumentFilter است که مانند مثالهای قبل با استفاده از کلاس پایه DocumentFilter پیاده سازی شده است . در این روش نیز مانند مثال قبل یک رشته ثابت بنام FLOAT تعریف شده که حاوی اعداد و علامت نقطه(0) به نشانه اعشار است . در این مثال عدد وارد شده می تواند دارای علامت نیز باشد .

package documentfilter;

import javax.swing.text.BadLocationException;

import javax.swing.text.DocumentFilter;

 

/**

 *

 * @author Mehdi Ghermezkon

 */

public class FloatNumberDocumentFilter extends DocumentFilter {

   

    public final String NUMERIC = "0123456789";

    public final String FLOAT = NUMERIC + ".";

    /** Creates a new instance of FloatNumberDocumentFilter */   

    public FloatNumberDocumentFilter() {

    }

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

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

        String acceptString = FLOAT ;

        acceptString += "-";

        for (int i=0; i < string.length(); i++) {

            if (acceptString.indexOf(string.valueOf(string.charAt(i))) == -1 ||

                    acceptString.indexOf(".") == -1)

                return;

        }

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

    }

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

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

        String acceptString = FLOAT ;

        acceptString += "-+";

        for (int i=0; i < text.length(); i++) {

            if (acceptString.indexOf(text.valueOf(text.charAt(i))) == -1 ||

                    acceptString.indexOf(".") == -1)

                return;

        }   

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

    }   

}

اضافه کردن DocumentFilter به JTextField

برای این کار ابتدا باید با استفاده از متد getDocument، داکیومنت مربوط به JTextField را گرفته و پس از ایجاد یک فیلتر با استفاده از یکی از کلاسهای فوق ، آنرا بوسیله متد setDocumentFilter به Document گرفته شده نسبت دهیم. به عنوان مثال برای کلاسهای فوق باید کد های زیر برای JTextField های مربوط بنویسیم.

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

Document doc = jTextField1.getDocument();

DocumentFilter filterOne = new UpperCaseDocumentFilter();

((AbstractDocument)doc).setDocumentFilter(filterOne);

  • وارد کردن حروف کوچک در JTextField

Document docLower = jTextField2.getDocument();

DocumentFilter filterTwo = new LowerCaseDocumentFilter();

((AbstractDocument)docLower).setDocumentFilter(filterTwo);

  • وارد کردن فقط عدد در JTextField

Document docThree = jTextField3.getDocument();

DocumentFilter filterThree = new IntegerOnlyDocumentFilter();

((AbstractDocument)docThree).setDocumentFilter(filterThree);

  • وارد کردن عدد دارای علامت در JTextField

Document docFour = jTextField4.getDocument();

DocumentFilter filterFour = new SignIntegerOnlyDocumentFilter();

((AbstractDocument)docFour).setDocumentFilter(filterFour);

  • وارد کردن اعداد اعشاری در JTextField

Document docFive = jTextField5.getDocument();

DocumentFilter filterFive = new FloatNumberDocumentFilter();

((AbstractDocument)docFive).setDocumentFilter(filterFive);

در دستورات فوق به این نکته توجه داشته باشید که باید ابتدا از کلاس تعریف شده یک نمونه جدید ایجاد کرده و سپس با استفاده از متد setDocumentFilter آنرا به JTextField نسبت میدهیم.