2010-07-28 5 views
0

J'ai conçu un composant pour J2ME, et est la méthode de peinture ici:Création d'un javax.microedition.lcdui.Image sur J2SE application

import javax.microedition.lcdui.Graphics; 
import javax.microedition.lcdui.Image; 
class Component { 
... 
public void paint(Graphics g) { 
    if (background != null) 
     g.drawImage(image, bounds.getLocation().x, bounds.getLocation().y, 0); 
} 
... 
} 

Je veux peindre ce composant sur une application J2SE, j'ai essayé pour peindre le composant sur une J2ME image et extrait l'int [] dans un InputStream, et créer une nouvelle image sur la plate-forme J2SE, avec cet objet:

public class ComponentStreamer { 
    private Component component; 
    private Image j2Me_Image; 

    public void setComponent(Component component) { 
     this.component = component; 
    } 

    public InputStream getInputStream() throws IOException { 
     if(component==null) 
      return null; 
     //THIS LINE THROWS THE EXCEPTION 
     j2Me_Image=Image.createImage(component.getSize().width, component.getSize().height); 
     component.paint(j2Me_Image.getGraphics()); 
      return getImageInputStream(j2Me_Image); 
    } 
} 

J'ai essayé l'objet, mais la ligne a commenté lève une exception:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: javax.microedition.lcdui.ImmutableImage.decodeImage([BII)V 
    at javax.microedition.lcdui.ImmutableImage.decodeImage(Native Method) 
    at javax.microedition.lcdui.ImmutableImage.getImageFromStream(Image.java:999) 
    at javax.microedition.lcdui.ImmutableImage.<init>(Image.java:955) 
    at javax.microedition.lcdui.Image.createImage(Image.java:554) 

Comment peut survient cette erreur?

Merci,
Adam.

Répondre

0

Eh bien,

Ce fut un processus très long de plonger dans les sources du J2ME MIDP et CLDC, et l'utilisation d'un ensemble appelé MicroEmulator, voici un code pour obtenir quelqu'un d'autre a commencé:

démarre un émulateur qui active ensuite certaines fonctionnalités J2Me.

private void setUpEmulator() { 
    try { 
     // overrideJ2MeImagePackageLock(); 
     Headless app = new Headless(); 
     DeviceEntry defaultDevice = new DeviceEntry("Default device", null, DeviceImpl.DEFAULT_LOCATION, true, false); 
     Field field = app.getClass().getDeclaredField("emulator"); 
     field.setAccessible(true); 
     Common emulator = (Common) field.get(app); 
     emulator.initParams(new ArrayList<String>(), defaultDevice, J2SEDevice.class); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println("Un-handled Exception"); 
    } 
} 

Ensuite, nous avons quelques autres objets agréable de travailler avec:

public class J2MeImageLayer extends ScalableLayer { 
    private static final long serialVersionUID = -4606125807092612043L; 

    public J2MeImageLayer() { 
     componentViewer.super(); 
    } 
    @Override 
    public void repaint() { 
     J2SEMutableImage mutableImage = new J2SEMutableImage(page.getSize().width, page.getSize().height); 
     page.paint(mutableImage.getGraphics()); 
     Graphics g = getImage().getGraphics(); 
     g.drawImage(mutableImage.getImage(), 0, 0, DCP_Simulator.this); 
    } 
    public void addComponent(Component component) { 
     page.add(component); 
    } 
    public void setComponent(final Component component) { 
     page.removeAllElements(); 
     final Container componentParent; 
     if ((componentParent = component.getParent()) != null) 
      component.setRemovedAction(new interfaces.Action() { 
       @Override 
       public void action() { 
        componentParent.add(component); 
       } 
      }); 
     page.add(component); 
    } 
} 

ce qui est le point culminant sur la façon de le faire.

Adam.

Questions connexes