بررسی تغییرات متن در JTextField

اگر در برنامه خود نیاز دارید که بدانید چه زمانی محتویات کامپوننت متنی و یا متن آن تغییر می کند،  باید از اینترفیس DocumentListener استفاده کرده و کنترل رویدادها را در درون آن انجام دهید . DocumentListener دارای متدهای زیر برای کنترل متن داخل JTextField و یا هر کامپوننت متنی دیگر است .

public interface DocumentListener implements EventListener {

                public void changedUpdate(DocumentEvent documentEvent);

                public void insertUpdate(DocumentEvent documentEvent);

                public void removeUpdate(DocumentEvent documentEvent);

}

به کمک DocumentListener شما می توانید متوجه شوید که چه زمانی متن به JTextField اضافه شده (insertUpdate) و یا چه زمانی متنی از آن حذف شده (removeUpdate) و یا چه زمانی متن داخل آن تغییر پیدا کرده است(()changedUpdate).

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

public interface DocumentEvent {

                public Document getDocument();

                public int getLength();

                public int getOffset();

                public DocumentEvent.EventType getType();

                public DocumentEvent.ElementChange getChange(Element element);

}

خاصیت Offset اطلاعاتی در مورد اینکه تغییر اطلاعات از کجای متن  شروع شده است را به ما می دهد و خاصیت Length تعداد کاراکترهای تغییر یافته را پیدا می کند. متد getChange برای پیدا کردن تغییرات نیازمند یک آبجکت از نوع Element میباشد، که برای ایجاد آن در اغلب موارد عنصر ریشه (RootElement) به عنوان پارامتر به این متد ارسال می شود. در کد زیر نحوه پیدا کردن و ارسال RootElement و ارسال آن به متد getChange نشان داده شوده است .

Document documentSource = documentEvent.getDocument();

Element rootElement = documentSource.getDefaultRootElement();

DocumentEvent.ElementChange change = documentEvent.getChange(rootElement);

برای آشنایی بیشتر با DocumentListener و نحوه ایجاد آن به مثال زیر توجه کنید.

در این مثال کلاسی بنام MyDocumentListener که با استفاده از کلاس پایه DocumentListener پیاده سازی شده ، ایجاد کرده و سپس متدهای inserUpdate() ، removeUpdate و changedUpdate را برای آن مانند کد زیر تعریف کردیم .

    public class MyDocumentListener implements DocumentListener {

       

        String newLine = "\n";

        /** Creates a new instance of MyDocumentListener */

        public MyDocumentListener() {

        }

        public void removeUpdate(DocumentEvent e){

            updateLog(e , "removed from");

        }

        public void changedUpdate(DocumentEvent e){

           

        }

        public void insertUpdate(DocumentEvent e){

            updateLog(e , "inserted into");

        }

       

        public void updateLog(DocumentEvent e , String action){

            Document doc = e.getDocument();

            int length = e.getLength();

            jTextArea1.append(length + " changelength " + action + doc.getProperty("name") + " . "

                    + newLine + " Text Length = " + doc.getLength() + newLine) ;

            javax.swing.text.Element rootElement = doc.getDefaultRootElement();

        }

    }

پس از ایجاد کلاس فوق برای اضافه کردن DocumentListener به JTextField باید ابتدا با استفاده از متد getDocument ،داکیومنت مربوط به JTextField  را گرفته و سپس به وسیله متد addDocumentListener کلاس فوق را به آن نسبت دهیم .

jTextField1.getDocument.addDocumentListener(new MyDoeumentListener));

نکته: برای اضافه کردن کد فوق در NetBeans باید آنرا در قسمت Post-Creation Code قرار دهید.