今天主要完成了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进行重绘.今天就先写这么多.