exibindo imagens no aplicativo J2ME

votos
1

Como faço para criar e exibir uma imagem no aplicativo J2ME?

E em qual pasta posso colocar essa imagem na minha aplicação?

Publicado 29/01/2009 em 08:58
fonte usuário
Em outras línguas...                            


3 respostas

votos
5

Este link tem exatamente o que você está procurando para começar.

Basicamente, para criar a imagem, você invocar Image.createImage ();

Image img = Image.createImage("/imageName.png");

Se ele estiver em uma sub-pasta no Jar:

Image img = Image.createImage("/subDir/imageName.png");

Para exibir a imagem, você precisa pintá-lo para uma tela através de uma ocorrência Graphics que está ligada à lona (melhor visualizado no link acima).

public void paint(Graphics g) {
    ...
    g.drawImage(img, 0, 0, Graphics.TOP | Graphics.LEFT);
    ....
}

Você também pode usar a função Graphics.drawRegion, mas aqui está um link para os JavaDocs para J2ME para você olhar através de ver o que é melhor para suas necessidades.

Respondeu 29/01/2009 em 16:09
fonte usuário

votos
1

Para desenhar uma imagem em um JavaME MIDlet você precisa de uma tela para pintar-lo para. Você pode fazer as seguintes: Firs você tem que colocar o arquivo de imagem original dentro de seu pacote ( "res" geralmente dentro ou um de seus subdiretórios). Em segundo lugar, você precisa criar uma classe estender lona e implementar o método de pintura:

import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

public class MyCanvas extends Canvas {
private Image image;
public MyCanvas(){
    try {
        image = Image.createImage("picture.png");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

protected void paint(Graphics g) {
    g.drawImage(image, 10, 10, Graphics.TOP | Graphics.LEFT);
}
}

Agora você precisa criar uma instância dessa classe e dizer ao MIDlet di exibi-lo, por exemplo:

import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class MyMIDlet extends MIDlet {
public MyMIDlet(){
}

protected void destroyApp(boolean unconditional)
        throws MIDletStateChangeException {
}

protected void pauseApp() {
}

protected void startApp() throws MIDletStateChangeException {
    Display.getDisplay(this).setCurrent(new MyCanvas());
}

}

Lembre-se que desta forma o Canvas será pintado apenas uma vez e se você mudar alguma coisa, você precisa chamar o método repaint ().

Respondeu 03/02/2009 em 10:47
fonte usuário

votos
0

Este código-fonte se baseia em comentários postados anteriormente:

import java.io.*;
import javax.microedition.io.*;
import javax.microedition.io.file.FileConnection;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class ImageLoader extends MIDlet
    implements CommandListener, Runnable {
  private Display mDisplay;
  private Form mForm;
  public ImageLoader() {
    mForm = new Form("Connecting...");
    mForm.addCommand(new Command("Exit", Command.EXIT, 0));
    mForm.setCommandListener(this);
  }
  public void startApp() {
    if (mDisplay == null) mDisplay = Display.getDisplay(this);
    mDisplay.setCurrent(mForm);     
    Thread t = new Thread(this);
    t.start();
  }
  public void pauseApp() {}
  public void destroyApp(boolean unconditional) {}
  public void commandAction(Command c, Displayable s) {
    if (c.getCommandType() == Command.EXIT)
      notifyDestroyed();
  }
  public void run() {
    FileConnection fc = null;
    DataInputStream in = null;
    DataOutputStream out = null;    
    try {
      fc = (FileConnection)Connector.open("file:///root1/i.PNG");
      int length = (int)fc.fileSize();//possible loss of precision may throw error
      byte[] data = null;
      if (length != -1) {
        data = new byte[length];
        in = new DataInputStream(fc.openInputStream());
        in.readFully(data);
      }
      else {
        int chunkSize = 512;
        int index = 0;
        int readLength = 0;
        in = new DataInputStream(fc.openInputStream());
        data = new byte[chunkSize];
        do {
          if (data.length < index + chunkSize) {
            byte[] newData = new byte[index + chunkSize];
            System.arraycopy(data, 0, newData, 0, data.length);
            data = newData;
          }
          readLength = in.read(data, index, chunkSize);
          index += readLength;
        } while (readLength == chunkSize);
        length = index;
      }
      Image image = Image.createImage(data, 0, length);
      ImageItem imageItem = new ImageItem(null, image, 0, null);
      mForm.append(imageItem);
      mForm.setTitle("Done.");
      fc = (FileConnection)Connector.open("file:///root1/x.PNG");
      if(!fc.exists()){
          try{
          fc.create();
          }catch(Exception ce){System.out.print("Create Error: " + ce);}
      }
      out = new DataOutputStream(fc.openOutputStream());
      out.write(data);
    }
    catch (IOException ioe) {
      StringItem stringItem = new StringItem(null, ioe.toString());
      mForm.append(stringItem);
      mForm.setTitle("Done.");
    }
    finally {
      try {
        if (in != null) in.close();
        if (fc != null) fc.close();
      }
      catch (IOException ioe) {}
    }
  }
}

O código é modificado a partir da Fostah link fornecido aqui.

Ele abre uma imagem, mostra que, em seguida, guarda-o como x.PNG vez de i.PNG usando FileConnection. A coisa complicada para assistir é onde o arquivo está sendo salvo / carregado a partir. Se o seu usando J2meWTK com Netbeans, em seguida, a pasta será exibido na janela de saída quando você executar o aplicativo móvel. A pasta será algo como temp.DefaultColorPhone / filesystem / root1. Isso é onde você terá que ter uma imagem. Eu não tenho certeza de como ter o ambiente temporário criado com a imagem por padrão. Isso significa que você tem que iniciar o aplicativo móvel, verificar onde a temperatura root1 / situa-se, em sua IDE, em seguida, solte a imagem para a pasta, em seguida, prosseguir com a execução do aplicativo ImageLoader. Vou tentar descobrir como automatizar este por postar uma pergunta. Além disso, começar com uma pequena imagem, 50x50 (imagens maiores pode causar problemas).

Respondeu 11/02/2009 em 19:25
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more