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

时间:2008-08-22 20:17:28

标签: java java-me lwuit

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

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

是在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获取'native'图形元素。画上它 - 有效地在LWUIT图像上绘画。我可以使用图像在组件上绘画。

它仍然看起来像黑客:)

但真正的问题是50kB的代码开销,即使在混淆之后。但这是另一个帖子的问题:)

/ JaanusSiim

2 个答案:

答案 0 :(得分:2)

我认为没有必要进行任何黑客攻击。您可以对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);

通过执行黑客操作,您确实失去了可移植性,而且您也暴露了实现私有对象,您可能也会破坏其他内容。

希望这有帮助。

答案 1 :(得分:0)

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

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

第三步是丑陋的。检查LWUIT mailing list以查看是否有人在此之前使用此框架。从已发布的API中我看不到另一种方法。

编辑:问题中添加的黑客看起来比我的黑客图像更好。对于一般情况,我所拥有的可能更好,但我不知道LWUIT或J2ME是否足以说明这一点。