`
univasity
  • 浏览: 800756 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

J2me paint[转]

    博客分类:
  • J2me
阅读更多

这是很久前另一个BLOG上的,现在不用了。转过来吧,方便查看...

 

在用J2ME的低级UI时,所有的界面绘制要靠自己来实现,主要是在paint消息中来做,这里涉及几个接口:paint,repaint,serviceRepaints,callSerially,我搞了一段时间才把它们弄明白。

paint

paint相当于是个回调函数,被J2ME主线程(处理UI和事件)来调用,任何时候我们都不能自己直接调用paint,程序在paint里面按部就班的画出界面即可,paint会带一个Graphics参数,用这个graphics去作图就可以了。

现在的很多J2ME平台已经默认支持双缓冲,所以在paint执行时,实际上界面并没有画出,而是等到paint执行完成后,一次性刷新到屏幕上的,不过这是和平台相关的。

repaint

这个是通知系统,我们需要刷新界面了,但仅仅是个通知,repaint会立即返回(无阻塞),paint会在合适的时候被系统调用,所以paint 和repaint不是一一对应的,有一个repaint并不意味着一定会触发一个paint,多个repaint可能会被合并到一个paint调用。

如果在paint里面调用repaint,那么就意味着这个paint结束后会被再次调用,这在有些需要连续不段的刷屏的程序中可能有用,不过显然不太合适,比如下面这种代码。

public void paint (Graphics g) {
repaint();
}

serviceRepaints

如果调用serviceRepaints,则会直接立刻重绘界面,阻塞式调用,直到paint完成。所以如果我们写出下面的paint接口:

public void paint (Graphics g) {
repaint();
serviceRepaints();
}

后果相当于递归调用,并很快造成内存耗尽(Out of memory)异常,因为serviceRepaints里面又会直接调用paint(),所以使用serviceRepaints一定要小心,可以在某 些地方使用serviceRepaints,但绝不能在paint里面调用。

callSerially

这个接口可以将一个Runable的接口抛在系统队列尾部,处理完消息之后,执行这个Runable接口的run,这在有些使用paint绘制的程 序中会用到,可以在paint完以后,通过callSerially触发run接口,表示界面已经画完,可以做别的事情了,又不会阻塞系统队列。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics