Живопись javax.microedition.lcdui.Графика на компоненте LWUIT - PullRequest
0 голосов
/ 23 августа 2008

Каков наилучший способ получения пользовательского элемента (который использует собственную графику J2ME), нарисованного на элементах LWUIT?

Пользовательский элемент представляет собой реализацию из библиотеки отображений, которая отображает свой контент (например, карту Google) в объект Graphics. Как можно нарисовать результат непосредственно на элементах LWUIT (сейчас я пытаюсь нарисовать его на компоненте).

Является ли единственный способ написать оболочку в LWUIT-пакете, которая бы раскрыла его внутреннюю реализацию?

Edit:

Джон: ваше решение выглядит очень сложным: 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. И я могу использовать изображение для рисования на компоненте.

И это все еще выглядит как взломать:)

Но настоящая проблема - это 50 КБ накладных расходов кода, даже после запутывания. Но это проблема для другого поста:)

/ JaanusSiim

Ответы [ 2 ]

2 голосов
/ 17 сентября 2008

Я не думаю, что взлом необходим. Вы можете создать подкласс класса 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);

В компоненте краски (г) метод:

g.drawImage(0,0, buffer);

В результате взлома, который вы сделали, вы теряете переносимость, а также потому, что вы выставляете закрытый объект реализации, вы также можете нарушать другие вещи.

Надеюсь, это поможет.

0 голосов
/ 08 сентября 2008

На основании javadoc для LWUIT и J2ME и предположения, что пользовательский класс J2ME представляет собой Canvas , похоже, вам нужно:

  • Подкласс Класс компонента LWUIT , упаковывающий пользовательский компонент J2ME
  • Переопределить метод paint () компонента LWUIT
  • Подкласс Графического класса J2ME , заключающий в себе класс LWUIT Graphics и пропускающий все вызовы метода через
  • Передать упакованную реализацию J2ME Graphics методу рисования пользовательского компонента J2ME

Этот третий шаг уродлив. Проверьте список рассылки LWUIT , чтобы узнать, есть ли у кого-нибудь эта купольная камера ранее. Из опубликованных API я не вижу другого способа сделать это.

Редактировать: добавленный в вопросе взлом выглядит лучше, чем мой взлом для Изображения. То, что у меня есть , может быть лучше для общего случая, но я не знаю ни LWUIT, ни J2ME достаточно хорошо, чтобы действительно сказать это.

...