2009-08-26 51 views
4

我在使用java 2ME加载图像时遇到问题。我在位置驱动器“C:”中有一个图像文件“picture.png”。之后,我写了这样的图像来显示这个位置的图像。在Java中加载图像J2ME

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) 

我开始学习如何开发,所以请大家指导做到这一点。

+0

检查文件名是否正确。图像加载器是区分大小写的,甚至文件名“picture.Png”,你会得到例外... – 2009-11-24 12:59:17

回答

4

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

+0

嗨JaanusSiim,我知道你在说什么,但我不知道如何在jar中设置根目录的位置。你能指导我设置吗?谢谢,Sopolin – Sopolin 2009-08-26 08:48:57

+0

你用什么工具创建jar?也许图像已经在那里了(一些工具把图像放到'res'文件夹中,你需要使用'/res/picture.png')。也许你只需要纠正路径。和根目录是在没有子文件夹:) – JaanusSiim 2009-08-26 08:54:24

+0

嗨,我使用NetBeans v6.7.1。回复我 谢谢,Sopolin – Sopolin 2009-08-26 09:42:47

-2

我的猜测是,

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

抛出防止类型的ImageItem的新对象留下您的ImageItem变量为空的创建一个例外。这给你空指针异常。

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

+0

我写了你提到的错误的单词。但它无法加载此图像。它仍然显示这个错误。 – Sopolin 2009-08-26 03:59:33

-2

验证文件picture.png确实存在

取决于设备仿真器/ IDE应该有设置该设备的“HOME”目录的方式。在你的情况下,这将是“C:\”

6

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

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

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

+0

嗨米塞尔,你能指导我把图像文件放在classpath中,并且示例代码如何得到它。Regarsds,Sopolin – Sopolin 2009-08-26 06:54:30

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