今天主要完成了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進行重繪.今天就先寫這麼多.