اینترفیس Document

Document Interface یک مدل داده ایی را برای انواع کامپوننتهایی که با text کار می کنند تعریف می کند. پیاده سازی این اینترفیس برای  JTextField و یا هر کامپوننت متنی دیگر موجب دسترسی به قابلیتهایی مانند رنگ فونت (Font Color) ، نوع فونت (Font Style) و ... را برای کامپوننت فراهم می کند. یکی از مزایای استفاده از این اینترفیس  این است که وقتی می خواهید تغییرات را در مورد یک JTextField بررسی کنید، می توانید برای پیدا کردن تغییرات متن، Document آنرا با استفاده از متد getDocument گرفته و بجای کامپوننت JTextField آنرا بررسی کنید  و یا همچنین برای آگاهی از انجام تغییرات در متن، DocumentListener را فراخوانی کنید و یا می توانید از آن برای کنترل ورودی و فیلتر سازی اطلاعات JTextField استفاده کنید.

البته در کنترلهای AWT می توان با استفاده از InputVerifier عمل بررسی اطلاعات ورودی را انجام داد، اما این Listener فقط زمانی که JTextField دارای Focus باشد فراخوانی میگردد. ولی با استفاده از Document دیگر نیازی به گرفتن Focus نمی باشد. در حقیقت این اینترفیس یک JTextfield و یا هر کامپوننت متنی دیگر را مانند یک فایل XML و HTML مورد پردازش قرار داده و می تواند از اطلاعات آنها برای سایر اعمال استفاده کند

کلاس AbstractDocument

این کلاس یک پیاده سازه پایه برای کلاس Docment است . در این کلاس لیستی از Listener های مدیریتی، متدهایی جهت اینکه محتویات کامپوننت تغییر پیدا کرده است یا نه و یک آبجکت Dictionary برای ذخیره خواص Document، موجود است . در جدول زیر لیست 11 خواص از کلاس AbstractDocument  ذکر گردیده است که 5 تا آنها جزء خواص اینترفیس Document بوده و اینترفیس Document آنها را از کلاس AbstractDocument به ارث برده است .

نام خاصیت

نوع داده ایی

نوع دسترسی

asynchronousLoadPriority

int

Read – Write

bidiRootElement

Element

Read - Only

defaultRootElement

Element

Read - Only

documentFilter

DocumentFilter

Read – Write

documentListeners

DocumentListener []

Read – Only

documentProperties

Dictionary

Read – Write

endPosition

Position

Read – Only

length

int

Read – Only

rootElements

Element []

Read - Only

startPosition

Position

Read – Only

UndoableEditListeners

UndoableEditListener []

Read - Only

بجز خاصیت DocumentFilter، در اغلب موارد نیازی به دسترسی به این خواص نخواهید داشت. به عنوان مثال برای دسترسی به  documentProperties می توانید از متد های public Object getProperty(Object key و public void putProperty(Object key , Object value  از اینترفیس Document استفاده کنید و یا برای خاصیت length می توانید آنرا بطور خیلی ساده با استفاده از متد getText(). length بدست آورید .

کلاس PlainDocument

کلاس PlaintDocument حالت خاصی از پیاده سازی با استفاده از کلاس AbstractDocument است. در این کلاس هیچ خاصیتی در مورد کاراکتر های و محتویات کامپوننت متنی نگهداری نمی شود و در عوض می توان بوسیله این کلاس موقعیت عناصر و یا اینکه هر خط از کجا شروع می شود را پیدا کرد. در برنامه زیر در بین عناصر یک PlainDocument حرکت کرده و آنها را به خروجی ارسال می کنیم . تصویر زیر نمایی از این برنامه نشان می دهد.

کد زیر را برای  دکمه Loop through PlainDocument بنویسید .

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                        

        Document document = jTextArea1.getDocument();

        ElementIterator iterator = new ElementIterator(document);

        javax.swing.text.Element element = iterator.first();

        while(element != null){

            System.out.println(element.getStartOffset());

            element = iterator.next();

        }

    }

پس از اجرای برنامه فوق خروجی برنامه بصورت زیر است :

0

0

16

32

عدد 0 اول نشان دهنده نقطه شروع متن ، عدد 0 دوم نشان دهنده نقطه شروع خط اول متن ، عدد 16 نقطه شروع خط دوم و عدد 32 نقطه شروع خط سوم است.