Загрузка изображения в Java J2ME
Вопрос
У меня проблема с загрузкой изображения с помощью Java 2ME.У меня есть файл изображения «picture.png» на диске «C:».После этого я написал вот так, чтобы показать изображение из этого места.
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)
Я начинаю учиться развиваться, поэтому, пожалуйста, подскажите, как это сделать.
Решение
Как мселл сказал - Вы не можете получить доступ к изображениям со своего компьютера.Убедитесь, что вы включили данное изображение в jar-файл мидлета.Если вы попытаетесь получить к нему доступ с помощью «/picture.png», он должен находиться в корневом каталоге jar.
Другие советы
Image.createImage(имя строки) загружает данное изображение как ресурс.Ресурсы загружены Class.getResourceAsStream(имя), который ищет ресурсы из пути к классам, а не из корня вашей файловой системы.
Вам следует поместить файл изображения в свой путь к классам, который обычно является конечным файлом .jar приложения.Обычно папка называется Ресурсы или рез создается под проект, в котором размещаются изображения.Содержимое этой папки затем копируется в файл .jar.На этапе разработки у вас должна быть возможность добавить папку ресурсов в путь к классам с помощью параметра командной строки (ресурсы java -cp в Java SE) или с аналогичной настройкой IDE.
Если вы действительно заинтересованы в загрузке изображений из реальной файловой системы, вы можете использовать дополнительный API FileConnection (http://developers.sun.com/mobility/apis/articles/fileconnection/).Однако поддержка этого API на телефоне ограничена.Для статических изображений лучше всего использовать путь к классам.
Прежде всего поместите свое изображение в пакет по умолчанию.Я поместил «My Network Places.png» в пакет по умолчанию.Затем создайте Midlet с именем «ImageIteMexample», затем скопируйте ниже код в этом файле средней части.
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);
}
}
}
Я предполагаю, что
image=Image.createImage("/picture.png");
выдает исключение, которое предотвращает создание нового объекта типа ImageItem, в результате чего ваша переменная imageItem остается нулевой.Это дает вам исключение нулевого указателя.
Разве твой файл не Изображение.png а не Picture.png?
Убедитесь, что файл картинка.png на самом деле существует
в зависимости от эмулятора/IDE устройства должен быть способ установить «HOME» каталог для устройства.В вашем случае это будет "C:\".