2009-08-26 83 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); 
} 
} 
}