在 LWUIT 组件上绘制 javax.microedition.lcdui.Graphics

Posted

技术标签:

【中文标题】在 LWUIT 组件上绘制 javax.microedition.lcdui.Graphics【英文标题】:Painting javax.microedition.lcdui.Graphics on LWUIT Component 【发布时间】:2008-08-22 20:17:27 【问题描述】:

在 LWUIT 元素上绘制自定义元素(即使用 J2ME 本机图形)的最佳方法是什么?

自定义元素是映射库的一个实现,它将其内容(例如 Google 地图)绘制到 Graphics 对象。怎么可能直接在 LWUIT 元素上绘制结果(目前我正试图在组件上绘制它)。

在 LWUIT 包中编写包装器的唯一方法是公开它的内部实现吗?

编辑:

John:您的解决方案看起来像很多工程:P 我最终使用的是以下包装器:

package com.sun.lwuit;

public class ImageWrapper 
  private final Image image;

  public ImageWrapper(final Image lwuitBuffer) 
    this.image = lwuitBuffer;
  

  public javax.microedition.lcdui.Graphics getGraphics() 
    return image.getGraphics().getGraphics();
  

现在我可以从 LWUIT 获取“本机”图形元素。在上面绘画 - 有效地在 LWUIT 图像上绘画。我可以使用图像在组件上进行绘制。

而且它看起来仍然像一个 hack :)

但真正的问题是 50kB 的代码开销,即使经过混淆处理也是如此。但这是另一个帖子的问题:)

/JaanusSiim

【问题讨论】:

【参考方案1】:

我认为没有必要进行任何黑客攻击。您可以子类化 LWTUI Component 类,然后您可以在组件的图形上下文中添加任何您想要的内容。你得到的不是原生的 lcdui.Graphics 对象,而是一个具有相同界面且易于使用的对象。

如果您确实需要将 lcdui.Graphics 传递给某个底层库以显示其输出,那么我建议您这样做:

在您的组件代码中的某处(仅在组件内容确实需要更改时才这样做):

private Image buffer = null; // keep this

int[] bufferArray = new int[desiredWidth * desiredHeight];
javax.microedition.lcdui.Image bufferImage = 
    Image.createEmptyImage(desiredWidth, desiredHeight);
thirPartyComponent.paint(bufferImage.getGraphics());
bufferImage.getRGB(bufferArray,0,1,0,0,desiredWidth, desiredHeight);
bufferImage = null; //no longer needed
buffer = Image.createImage(bufferArray, desiredWidth, desiredHeight);

在组件paint(g)方法中:

g.drawImage(0,0, buffer);

通过你所做的 hack,你正在失去可移植性,而且你正在暴露实现私有对象,你可能还会破坏其他东西。

希望这会有所帮助。

【讨论】:

【参考方案2】:

基于 LWUIT 和 J2ME 的 javadoc,并猜测自定义 J2ME 类是 Canvas,看起来您必须:

子类 LWUIT's Component class 包装自定义 J2ME 组件 覆盖 LWUIT 组件的 paint() 方法 子类化包装 LWUIT Graphics 类的J2ME Graphics class 并传递所有方法调用 将包装好的 J2ME 图形实现传递给自定义 J2ME 组件的绘制方法

第三步是丑陋的一步。检查LWUIT mailing list 看看是否有人以前做过圆顶。从已发布的 API 中,我看不到另一种方法。

编辑:问题中添加的 hack 看起来比我对图像的 hack 更好。对于一般情况,我所拥有的可能会更好,但我对 LWUIT 或 J2ME 的了解都不够好,无法真正这么说。

【讨论】:

以上是关于在 LWUIT 组件上绘制 javax.microedition.lcdui.Graphics的主要内容,如果未能解决你的问题,请参考以下文章

lwuit 视频组件浮动在命令上

LWUIT 中的提示文本

LWUIT 滚动跳跃问题

如何在 LWUIT 中的表单之间切换

如何从 LWUIT 组件中处理对话框

当按下向下箭头键时,防止 LWUIT 表单的最后一个组件失去焦点