Aexi(2)

   今天主要完成了Aexi的Caret功能.

   那麼什麼是Caret呢?請看下圖.


     對的,大家幾乎每天都在和它打交道,這個閃爍的小光標就是傳說中Caret.

     我們實現它的方案非常之簡單.

         1. 首先,先封裝一個Caret類,Caret內部有個成員變量isShow,有個drawMe()方法用於繪製自身.

          2. Caret內部開啓一個線程每隔固定的時間改變該變量,並定義一個Listener接口與Caret所依附的view進行通信.

          3. 當該成員變量改變時,調用listener通知view重繪.

         4. 重寫view的重繪方法,使其遵循一定的順序,目前是先繪製了背景,然後調用Caret的drawMe()方法.這樣當isShow爲false時,drawMe()方法不會繪製任何東西.這樣就實現了Caret的閃爍繪製.

     爲什麼這個功能需要自己實現呢,而不是通過繼承已有的文字組件實現呢?這是因爲每個平臺的api都不會一樣,爲了保證移植時能夠最小限度的修改代碼,我們能夠自己實現的功能都儘量自己實現.但是也有功能是可以不用自己實現的,比如菜單欄、功能條、toolbar這種,我們就可以依賴於swing框架來實現.因爲這些功能是要跨平臺的,現在只是做個簡單演示,所以可以依賴於swing框架.

    現在的設計還比較簡陋,我們可以做一些初步的優化.

    首先,定義接口Glyph.讀過《DP》的讀者應該知道這個接口用來描述文檔中每個可視對象,我們的光標Caret同樣也應該是Glyph的一種.暫且只定義一個方法drawMe();

    其次,還可以再定義一個Document類,作爲View顯示的頂層類.然後將Caret以及之後的Char等等的Glyph對象的請求逐級轉發給上層,最終來到Document,由Document統一通知View進行重繪.今天就先寫這麼多.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章