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)

我开始学习开发,所以请指导这样做。

4

5 回答 5

6

Image.createImage(String name)将给定的图像作为资源加载。资源使用Class.getResourceAsStream(name)加载,它从类路径而不是文件系统根目录中查找资源。

您应该将图像文件放在您的类路径中,这通常是最终的应用程序 .jar 文件。通常在项目下会创建一个名为resourcesres的文件夹,用于放置图像。然后将该文件夹的内容复制到 .jar 文件中。在开发阶段,您应该能够使用命令行参数( Java SE 中的java -cp 资源)或类似的 IDE 设置将资源文件夹附加到类路径中。

如果您真的对从实际文件系统加载图像感兴趣,可以使用可选的 FileConnection API ( http://developers.sun.com/mobility/apis/articles/fileconnection/ )。不过,手机对此 API 的支持是有限的。对于静态图像,类路径是要走的路。

于 2009-08-26T05:16:35.130 回答
4

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

于 2009-08-26T06:50:53.083 回答
2

首先将您的图像放在默认包中。我已将“网上邻居.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);
}
}
}
于 2010-10-06T16:33:05.290 回答
-2

我的猜测是

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

引发一个异常,该异常会阻止创建 ImageItem 类型的新对象,从而使您的 imageItem 变量为空。这给了你空指针异常。

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

于 2009-08-26T03:47:10.773 回答
-2

验证文件picture.png确实存在

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

于 2009-08-26T05:11:39.540 回答