在Java J2ME中加载图像

4

我在使用Java 2ME加载图片时遇到了问题。我在"C:"驱动器的位置有一个名为"picture.png"的图片文件。之后我编写了以下代码来显示该位置的图片。

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

public class ImageMidlet extends MIDlet implements CommandListener{
    private Display display;
    private Command exitCommand;
    private Command backCommand;
    private Command okCommand;
    private Form form;

    private ImageItem imageItem;
    private Image image;

    public ImageMidlet(){
        display = Display.getDisplay(this);
        form=new Form("");
        exitCommand = new Command("Exit", Command.EXIT, 1);
        backCommand = new Command("Back", Command.BACK, 2);
        okCommand = new Command("OK", Command.OK, 3);

        try {
            image=Image.createImage("/picture.png");
            imageItem=new ImageItem(null,image,ImageItem.LAYOUT_NEWLINE_BEFORE,"");
        }
        catch(IOException ex){

        }
        form.append(imageItem);
        form.addCommand(okCommand);
        form.addCommand(exitCommand);
        form.addCommand(backCommand);
        form.setCommandListener(this);

        display.setCurrent(form);

    }

    public void commandAction(Command c,Displayable d){

    }

    public void startApp() {
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

它显示了这个错误:
Unable to create MIDlet Test.ImageMidlet
java.lang.NullPointerException
     at javax.microedition.lcdui.Form.append(Form.java:638)
     at Test.ImageMidlet.<init>(ImageMidlet.java:39)
     at java.lang.Class.runCustomCode(+0)
     at com.sun.midp.midlet.MIDletState.createMIDlet(+34)
     at com.sun.midp.midlet.Selector.run(Selector.java:151)

我正在开始学习开发,希望您能指导我如何做。


请检查文件名是否正确。图像加载器区分大小写,即使文件名为“picture.Png”,您也会收到异常... - user217792
5个回答

6

Image.createImage(String name)方法会将给定的图片作为资源加载。这些资源是通过Class.getResourceAsStream(name)加载的,它会从类路径中查找资源,而不是从文件系统根目录中查找。

你应该将图片文件放在类路径中,通常是最终的应用程序.jar文件。通常在项目下创建一个名为resourcesres的文件夹,并将图片放置其中。然后将此文件夹的内容复制到.jar文件中。在开发阶段,你可以使用命令行参数(java -cp resources在Java SE中)或类似的IDE设置来将资源文件夹添加到类路径中。

如果你真的想要从实际的文件系统中加载图片,则可以使用可选的FileConnection API (http://developers.sun.com/mobility/apis/articles/fileconnection/)。但是,这个API的手机支持是有限的。对于静态图片,类路径是更好的选择。


嗨,msell,你能指导我如何将图像文件放入类路径中,并提供获取它的示例代码吗?谢谢,Sopolin。 - Sopolin

4
如msell所说 - 您无法从计算机中访问图像。请确保您已将给定的图像包含在midlet jar文件中。如果您尝试使用'/picture.png'访问它,则应该位于jar根目录中。

嗨JaanusSiim,我知道你说的话,但我不知道如何设置jar文件中根目录的位置。你能指导我如何设置吗?谢谢,Sopolin。 - Sopolin
你使用什么工具创建jar包的?也许图像已经存在(有些工具会将图像放在'res'文件夹中,您需要使用'/res/picture.png')。也许您只需要更正路径。而根目录不在子文件夹中 :) - JaanusSiim
嗨,我正在使用NetBeans v6.7.1。请尽快回复我。谢谢,Sopolin。 - Sopolin
使用Java_ME_platform_SDK_3.0平台。 - Sopolin
非常感谢 JaanusSiim,我明白了。 - Sopolin

2

首先将您的图像放置在默认包中。 我已经将“My Network Places.png”放置在默认包中。 然后创建名为“ImageItemExample”的MIDlet 然后将下面的代码复制到该MIDlet文件中。

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

public class ImageItemExample extends MIDlet implements CommandListener{
private Display display;
private Command exit;
private Form form;
private ImageItem logo;

public ImageItemExample(){
form = new Form("Image Item");
exit = new Command("Exit", Command.EXIT, 0);
try{
  logo = new ImageItem(null, Image.createImage("/My Network Places.png"),
   ImageItem.LAYOUT_CENTER | ImageItem.LAYOUT_NEWLINE_BEFORE |
    ImageItem.LAYOUT_NEWLINE_AFTER, "Roseindia");
  form.append(logo);
}catch(IOException e){
  form.append(new StringItem(null, "Roseindia: Image not available: "+ e));
}
}

public void startApp(){
display = Display.getDisplay(this);
form.addCommand(exit);
form.setCommandListener(this);
display.setCurrent(form);
}

public void pauseApp(){}

public void destroyApp(boolean unconditional){
notifyDestroyed();
}

public void commandAction(Command c, Displayable d){
String label = c.getLabel();
if(label.equals("Exit")){
  destroyApp(true);
}
}
}

-2

我的猜测是

image=Image.createImage("/picture.png");

抛出异常会阻止创建类型为ImageItem的新对象,这将使您的imageItem变量为空。这会导致空指针异常。

你的文件不是Pictur.png而是Picture.png吗?


我像你提到的一样写错了单词,但是它无法加载这个图片。它仍然显示这个错误。 - Sopolin

-2

验证文件picture.png是否存在

根据设备模拟器/IDE,应该有一种方法来设置设备的“HOME”目录。在您的情况下,这将是“C:\”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接