Сведения о вопросе

PIRLO

22:19, 25th August, 2020

Теги

java   java-me   lwuit    

Картина javax.microedition.lcdui.Graphics на компоненте LWUIT

Просмотров: 474   Ответов: 2

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

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

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

Редактировать:

Джон: ваше решение выглядит как много техники: 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();
  }
}

Теперь я могу получить графический элемент 'native' из LWUIT. Краска на нем-эффективно живопись на изображении LWUIT. И я могу использовать изображение для рисования на компоненте.

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

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

/JaanusSiim



  Сведения об ответе

+-*/

10:09, 25th August, 2020

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

g.drawImage(0,0, buffer);

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

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


  Сведения об ответе

SSESION

14:03, 28th August, 2020

Основываясь на javadoc для LWUIT и J2ME и предполагая, что пользовательский класс J2ME является холстом , похоже, что вам придется:

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться