2008-08-22 10 views
0

Quelle serait la meilleure méthode pour obtenir un élément personnalisé (utilisant J2ME natif Graphics) peint sur des éléments LWUIT?Peinture javax.microedition.lcdui.Graphics sur le composant LWUIT

L'élément personnalisé est une implémentation de la bibliothèque de mappage, qui peint son contenu (par exemple, Google map) en objet Graphics. Comment serait-il possible de peindre le résultat directement sur les éléments LWUIT (au moment où j'essaye de le peindre sur un composant).

La seule façon d'écrire un wrapper dans le package LWUIT, qui en exposerait l'implémentation interne?

Edit:

John: votre solution ressemble à beaucoup d'ingénierie: P Ce que je fini par utiliser suit emballage:

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(); 
    } 
} 

Maintenant, je peux obtenir le ' Élément graphique natif de LWUIT. Peignez dessus - peignez efficacement sur l'image de LWUIT. Et je peux utiliser l'image pour peindre sur un composant.

Et il ressemble toujours à un hack :)

Mais le vrai problème est des frais généraux de 50 Ko code, même après l'obscurcissement. Mais cela est un problème pour un autre poste :)

/JaanusSiim

Répondre

0

Basé sur le javadoc pour LWUIT et J2ME et deviner que la classe J2ME personnalisée est un Canvas il semble que vous auriez à:

  • Sous-classe LWUIT's Component class enveloppant le procédé composant J2ME personnalisé
  • Remplacer la peinture() du composant LWUIT
  • Sous-classe de la classe J2ME Graphics class enveloppant le LWUIT Graphics et transmettre toutes la méthode appelle par
  • passe dans la mise en œuvre J2ME Graphics enveloppé à la méthode de peinture de composants J2ME personnalisé

Cette troisième étape est une laide. Vérifiez sur le LWUIT mailing list pour voir si quelqu'un a dôme ce avant. À partir des API publiées, je ne vois pas d'autre moyen de le faire. Edit: Le hack ajouté dans la question semble mieux que mon hack pour une Image. Ce que j'ai peut être mieux pour un cas général, mais je ne connais pas assez bien LWUIT ou J2ME pour vraiment le dire.

2

Je ne pense pas qu'un piratage soit nécessaire. Vous pouvez sous-classer la classe de composants LWTUI et vous pouvez alors faire souffrir ce que vous voulez dans le contexte graphique du composant. Vous n'obtenez pas l'objet natif lcdui.Graphics mais un objet avec une même interface facile à utiliser.

Si vous avez vraiment besoin de passer un lcdui.Graphiques à une bibliothèque sous-jacente pour afficher sa sortie alors je suggère ceci:

Quelque part dans votre code de composant (faire que lorsque le contenu des composants vraiment besoin d'être changé):

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); 

Dans la peinture des composants (g) méthode:

g.drawImage(0,0, buffer); 

en faisant le hack vous ne vous perdez portablity et aussi SICE vous exposez objet privé de mise en œuvre, vous pouvez aussi casser d'autres choses.

Espérons que cela aide.

Questions connexes