这是很久前另一个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接口,表示界面已经画完,可以做别的事情了,又不会阻塞系统队列。
分享到:
相关推荐
### J2ME中Paint()方法的优化技巧 随着软件功能的不断丰富与复杂化,针对J2ME(Java 2 Micro Edition)平台上的应用程序进行性能优化变得尤为重要。特别是在图形渲染方面,`paint()`方法作为绘制界面的核心部分,其...
2. **绘制菜单**:在Canvas类的paint()方法中,使用Graphics对象进行绘制。首先设定画布的背景色,然后根据当前选中的菜单项,计算旋转角度,用rotate()方法旋转菜单项的位置,最后使用drawString()方法将菜单项绘制...
protected void paint(Graphics g) { g.setColor(0xFF0000); // 设置红色作为背景 g.fillRect(0, 0, getWidth(), getHeight()); // 保存原始绘图状态 g.save(); // 平移图形到中心 int width = getWidth();...
J2ME的`Font`用于处理文本的样式和大小,而在Android中,我们可以使用`Typeface`和`Paint`类。`Typeface`定义字体风格,而`Paint`则包含绘制文本的样式信息。为了封装`Font`,我们需要创建一个自定义的`Font`类,...
2. **Canvas类**:Canvas是绘制游戏画面的基础,开发者需要重写其`paint()`方法来实现游戏的渲染逻辑。 3. **事件处理**:J2ME中的键盘和触摸事件处理是游戏交互的关键,需要理解和掌握`KeyListener`接口或`Command...
- **绘图**:J2ME的Graphics类与Android的Canvas类类似,但Android提供了更丰富的绘图API,如Paint类。 - **事件处理**:J2ME的键盘事件通过keyPressed、keyRepeated和keyReleased方法处理,Android则使用...
`paint(Graphics g)` 方法是关键,它在每次屏幕需要重绘时被调用。在这里,如果 `clearDisplay` 标志为真,那么会先清空背景,然后重新设置起始坐标,以准备新的绘画。 程序的绘图逻辑没有在提供的代码中完全展示,...
自定义`Canvas`类并重写`paint()`方法,可以实现自定义的绘图逻辑。 3. **事件处理**: 实例中可能会包含对按键事件的处理,比如使用`KeyListener`接口或`Command`对象来响应用户的按键操作。例如,你可以定义不同的...
这通常涉及继承`Canvas`类并重写`paint()`方法,或者使用`Form`和`Item`的组合。自定义组件可以实现复杂的交互逻辑,比如可拖动的滑块、可旋转的选择器等。自定义组件的关键在于理解绘图流程和事件处理机制,以及...
游戏通常会创建一个继承自Canvas的子类,并重写paint()方法来进行游戏画面的绘制。同时,还需要了解键盘和触摸事件的处理,以便实现玩家交互。 "3170.jad"和"15382677623.jar"是两个关键的文件,它们分别是JAD...
4. 游戏开发基础:"是男人就下一百层"这款游戏通常会用到J2ME的Canvas类来绘制游戏场景,通过重写paint()方法实现画面的更新。游戏逻辑则通过事件处理和定时器来驱动,比如玩家的移动、碰撞检测以及计分系统。 5. ...
我们可以通过重写 `paint()` 方法来绘制菜单项,并使用 `drawArc()` 或 `drawPolygon()` 方法创建旋转的形状。 此外,我们还需要处理用户输入事件,例如触摸屏的滑动或按键输入。这可以通过继承 `CommandListener` ...
典型的循环包括update()和paint()方法。 3. **图形与动画**:J2ME使用Canvas类来绘制游戏元素。开发者会使用drawRect(), drawImage()等方法来创建和更新游戏中的对象,如飞船、敌人和子弹。 4. **碰撞检测**:为了...
开发者通常会继承Canvas,重写其`paint()`方法,用以绘制游戏画面,包括蛇、食物和其他元素。 4. **事件处理**:J2ME中的键盘事件处理是通过覆写`keyPressed()`, `keyReleased()`, `keyRepeated()`方法来实现的。...
例如,`update()`和`paint()`方法在J2ME中扮演关键角色。 3. **碰撞检测**:游戏中的物体交互往往需要进行碰撞检测,以确定是否发生接触。这通常涉及到几何学算法,如轴对齐边界框(AABB)或更复杂的碰撞模型。 4....
通过重写`paint()`方法,我们可以实现游戏画面的更新和动画效果。 2. **图形与动画**:使用J2ME的Graphics对象,我们可以进行基本的绘图操作,如填充颜色、绘制线条和形状。为了实现角色和物体的动画效果,可以利用...
2. **图形界面**:J2ME使用`Canvas`类作为游戏画面的基础,开发者需要重写`paint()`方法来绘制游戏元素,如蛇、食物和边界。 3. **事件处理**:通过监听键盘或触摸屏事件,游戏可以响应用户的操作。J2ME使用`...
开发者可以重写其`paint()`方法来创建游戏的视觉元素。 4. **事件处理**:理解和实现按钮点击、触摸屏输入等用户交互事件是J2ME游戏开发的关键。通常需要覆盖`keyPressed()`, `keyReleased()`等方法来响应用户操作...
**J2ME低级界面全示例Eclipse** Java Micro Edition (J2ME) 是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如手机、智能手表等。J2ME提供了多种框架来构建应用程序,其中的低级界面(Low-Level User ...